4

我有一个挑战:创建一个程序,该程序在按下按钮时从网络摄像头获取图像。附加条件:不要使用第三方组件(如 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.

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

是这样吗?如果是,我该如何纠正?如果不是,为什么该程序在第二次和其他启动时不起作用?感谢您的建议。

4

1 回答 1

3

First of all, I wont be able to really help you with your current code, then again i think no one will so here is an alternative.

I understand you don't want to use a 3e party component but I think using AVICAP32.DLL is not a better option.

This page offers a great way to use webcams under windows, its very reliable and allows you to set any cam property. Its all opensource, easy to use and based on native windows DirectX libraries.

It has never failed me.

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

Good luck and have fun, Delphi rocks.

于 2013-04-07T23:37:16.793 回答