使用Delphi 7中的WinAPI从网络摄像头拍照

我有一个挑战:创建一个程序,当按下按钮时从网络摄像头拍摄图像.附加条件:不要使用第三方组件(如DSPack),只使用WinAPI.我写了以下代码.

unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls,ShellAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const WM_CAP_START = WM_USER;
    WM_CAP_STOP = WM_CAP_START + 68;
    WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
    WM_CAP_DRIVER_disCONNECT = WM_CAP_START + 11;
    WM_CAP_SAVEDIB = WM_CAP_START + 25;
    WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
    WM_CAP_SEQUENCE = WM_CAP_START + 62;
    WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

function capCreateCaptureWindowA(lpszWindowName : PCHAR;
    dwStyle : longint;
    x : integer;
    y : integer;
    nWidth : integer;
    nHeight : integer;
    ParentWin : HWND;
    nId : integer): HWND;
    stdcall external 'AVICAP32.DLL';

var
    Form1: TForm1;

implementation
{$R *.dfm}


var hWndC : THandle;

procedure TForm1.Button1Click(Sender: TObject);
begin
 hWndC := capCreateCaptureWindowA('My Own Capture Window',WS_CHILD or WS_VISIBLE,Panel1.Width,Panel1.Height,Panel1.Handle,0);

if hWndC <> 0 then 
    SendMessage(hWndC,WM_CAP_DRIVER_CONNECT,0); 

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  hWndC := 0;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if hWndC <> 0 then
  begin
    SendMessage(hWndC,WM_CAP_DRIVER_disCONNECT,0); 
    hWndC := 0;
  end;
end;

end.

表单上有两个按钮和一个面板.该程序编译成功,并在第一次启动时运行良好;但是,在第二次和随后的发布中,会出现一个窗口,提供选择设备,但即使在选择它之后也无法正常工作.我想在第一次启动后,程序没有将相机的驱动程序恢复到原始状态.

是这样吗?如果是,我该如何纠正?如果没有,为什么该程序不适用于第二次和其他发布?谢谢你的建议.

解决方法

首先,我不能真正帮助你使用当前的代码,然后我认为没有人会这样做是另一种选择.

我知道你不想使用3e方组件,但我认为使用AVICAP32.DLL不是更好的选择.

页面提供了在Windows下使用网络摄像头的绝佳方式,它非常可靠,并允许您设置任何凸轮属性.它的所有开源,易于使用,并基于本机Windows DirectX库.

它从未让我失望过.

http://www.delphibasics.info/home/delphibasicsprojects/directxdelphiwebcamcaptureexample

祝好运并玩得开心点,德尔福岩石.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...