在Delphi7中使用WinAPI从网络摄像机拍摄照片
我有一个挑战:创建一个程序,当按下一个按钮时,它可以从网络摄像机中拍摄图像。附加条件:不要使用第三方组件(如DSPack),只使用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
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!