在Delphi7中使用WinAPI从网络摄像机拍摄照片

在Delphi7中使用WinAPI从网络摄像机拍摄照片,delphi,camera,delphi-7,media,Delphi,Camera,Delphi 7,Media,我有一个挑战:创建一个程序,当按下一个按钮时,它可以从网络摄像机中拍摄图像。附加条件:不要使用第三方组件(如DSPack),只使用WinAPI。我编写了以下代码 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls,ShellAPI; type TForm1 = class(TForm) B

我有一个挑战:创建一个程序,当按下一个按钮时,它可以从网络摄像机中拍摄图像。附加条件:不要使用第三方组件(如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 ,
    0,
    0,
    Panel1.Width,
    Panel1.Height,
    Panel1.Handle,
    0);

if hWndC <> 0 then 
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 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, 0); 
    hWndC := 0;
  end;
end;

end.
单元1;
接口
使用
窗口、消息、系统、类、图形、控件、窗体、,
对话框、ExtCtrls、StdCtrls、ShellAPI;
类型
TForm1=类(TForm)
按钮1:t按钮;
按钮2:t按钮;
小组1:TPanel;
程序按钮1点击(发送方:ToObject);
过程表单创建(发送方:ToObject);
程序按钮2点击(发送者:对象);
私有的
{私有声明}
公众的
{公开声明}
结束;
const WM_CAP_START=WM_USER;
WM\U CAP\U STOP=WM\U CAP\U START+68;
WM_CAP_DRIVER_CONNECT=WM_CAP_START+10;
WM_CAP_驱动器_断开=WM_CAP_启动+11;
WM_CAP_SAVEDIB=WM_CAP_START+25;
WM_CAP_GRAB_FRAME=WM_CAP_START+60;
WM\U CAP\U序列=WM\U CAP\U START+62;
WM_CAP_FILE_SET_CAPTURE_FILEA=WM_CAP_START+20;
函数capCreateCaptureWindowA(lpszWindowName:PCHAR;
风格:长;
x:整数;
y:整数;
nWidth:整数;
nHeight:整数;
ParentWin:HWND;
nId:整数):HWND;
stdcall外部“AVICAP32.DLL”;
变量
表1:TForm1;
实施
{$R*.dfm}
var hWndC:THandle;
程序TForm1.按钮1单击(发送方:TObject);
开始
hWndC:=capCreateCaptureWindowA('我自己的捕获窗口',
WS_CHILD或WS_VISIBLE,
0,
0,
面板1.宽度,
1.高度,
面板1.手柄,
0);
如果hWndC为0,则
发送消息(hWndC,WM\U CAP\U驱动程序\U CONNECT,0,0);
结束;
过程TForm1.FormCreate(发送方:TObject);
开始
hWndC:=0;
结束;
程序TForm1.按钮2单击(发送方:TObject);
开始
如果hWndC为0,则
开始
发送消息(hWndC,WM\U CAP\U驱动器\U断开,0,0);
hWndC:=0;
结束;
结束;
结束。
表单上有两个按钮和一个面板。程序编译成功,首次启动时运行良好;但是,在第二次和后续启动时,会出现一个窗口,提供选择设备的功能,但即使在选择设备后,该窗口仍不起作用。我猜在第一次启动后,程序并没有将相机的驱动程序恢复到原始状态


是这样吗?如果是,我如何更正?如果没有,为什么该计划在第二次和其他发射上不起作用?谢谢您的建议。

首先,我无法真正帮助您使用当前代码,然后我想没有人会这样做,所以这里有一个替代方案

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

这个页面提供了一个在windows下使用网络摄像头的好方法,它非常可靠,允许您设置任何cam属性。它完全开源,易于使用,并且基于本机windows DirectX库

我从未失望过

祝你好运,玩得开心,
Delphi rocks.

在表单的
OnDestroy
事件中,尝试通过发送
WM_close
消息来关闭捕获窗口。遗憾的是,这并没有解决问题此API确实是史前的,为什么不使用DirectShow?或Windows图像采集?Windows的视频,如果你问我的话,可以称为WinAPI!