我有一个挑战:创建一个程序,当按下按钮时,该程序从网络摄像头拍摄图像。附加条件:不要使用第三方组件(如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.
表单上有两个按钮和一个面板。该程序编译成功,并在第一次启动时运行良好;但是,在第二次和随后的发布中,会出现一个窗口,提供选择设备,但即使在选择它之后也无法正常工作。我想在第一次启动后,程序没有将相机的驱动程序恢复到原始状态。
这是这样吗?如果是,我该如何纠正?如果没有,为什么该程序不适用于第二次和其他发布?谢谢你的建议。答案 0 :(得分:3)
首先,我无法真正帮助您使用当前的代码,然后我认为没有人会这样做是替代。
我知道您不想使用3e派对组件,但我认为使用AVICAP32.DLL不是更好的选择。
此页面提供了在Windows下使用网络摄像头的绝佳方式,它非常可靠,并允许您设置任何凸轮属性。它的所有开源,易于使用,并基于本机Windows DirectX库。
它从未让我失望。
http://www.delphibasics.info/home/delphibasicsprojects/directxdelphiwebcamcaptureexample
祝你好运,玩得开心, 德尔福摇滚。