나는 challange가 있습니다. 버튼을 누르면 웹 카메라에서 이미지를 가져 오는 프로그램을 만듭니다. 추가 조건 : 제 3 자 구성 요소 (예 : DSPack)를 사용하지 말고 WinAPI 만 사용하십시오. 나는 다음과 같은 코드를 작성했다.Delphi 7의 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.
두 개의 버튼과 패널이 폼에 있습니다. 프로그램은 성공적으로 컴파일되고 처음 실행될 때 잘 작동합니다. 그러나 두 번째 및 후속 실행에서 장치를 선택하는 창이 나타나지만 선택 후에도 작동하지 않습니다. 첫 번째 출시 이후에이 프로그램은 카메라의 드라이버를 원래 상태로 되돌릴 수 없다고 생각합니다.
이게 맞습니까? 그렇다면 어떻게 해결할 수 있습니까? 그렇지 않은 경우, 프로그램이 두 번째 및 다른 런치에서 작동하지 않는 이유는 무엇입니까? 제안에 감사드립니다.
양식의 'OnDestroy' 이벤트에서 캡처 창을 닫으려면'WM_CLOSE '메시지를 보내야합니다. –
슬프지만 문제가 해결되지 않았습니다 – skeeph
이 API는 실제로 선사 시대입니다. 왜 DirectShow를 사용하지 않을까요? – OnTheFly