Prendre une photo à partir d'un web-caméra à l'aide de WinAPI dans Delphi 7

J'ai un challenge: créer un programme qui prend une image à partir d'un web-caméra quand un bouton est pressé. Condition supplémentaire: ne pas utiliser de composants tiers (comme DSPack), juste la WinAPI. J'ai écrit le code suivant.

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.

Il y a deux boutons et un panneau sur la forme. Le programme compile correctement, et fonctionne bien, une fois lancé, la première fois; toutefois, à la deuxième et les suivantes lance il apparaît une fenêtre qui propose de sélectionner un périphérique, mais même après l'avoir sélectionné ne fonctionne pas. Je suppose que, après le premier lancement, le programme n'est pas le retour de l'appareil pilote à son état d'origine.

Est-ce donc? Si elle l'est, comment puis-je la corriger? Si non, pourquoi ne pas travailler sur la deuxième et les autres lance? Merci pour les suggestions.

Dans votre formulaire OnDestroy cas, essayez de fermer la fenêtre de capture en l'envoyant WM_CLOSE message.
Triste, mais il n'est pas résolu le problème
Cette API est vraiment préhistorique, pourquoi ne pas utiliser DirectShow?
ou d'Acquisition d'Images Windows? msdn.microsoft.com/en-us/library/windows/desktop/...
Vidéo Pour Windows, est admissible à titre de WinAPI si vous me demandez! msdn.microsoft.com/en-us/library/windows/desktop/...

OriginalL'auteur skeeph | 2013-03-30