2013-03-30 4 views
4

나는 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. 

두 개의 버튼과 패널이 폼에 있습니다. 프로그램은 성공적으로 컴파일되고 처음 실행될 때 잘 작동합니다. 그러나 두 번째 및 후속 실행에서 장치를 선택하는 창이 나타나지만 선택 후에도 작동하지 않습니다. 첫 번째 출시 이후에이 프로그램은 카메라의 드라이버를 원래 상태로 되돌릴 수 없다고 생각합니다.

이게 맞습니까? 그렇다면 어떻게 해결할 수 있습니까? 그렇지 않은 경우, 프로그램이 두 번째 및 다른 런치에서 작동하지 않는 이유는 무엇입니까? 제안에 감사드립니다.

+1

양식의 'OnDestroy' 이벤트에서 캡처 창을 닫으려면'WM_CLOSE '메시지를 보내야합니다. –

+0

슬프지만 문제가 해결되지 않았습니다 – skeeph

+0

이 API는 실제로 선사 시대입니다. 왜 DirectShow를 사용하지 않을까요? – OnTheFly

답변

1

우선, 현재 코드를 실제로 사용하는 데 도움이되지 않을 것입니다. 그렇다면 아무도 여기에서 대안을 찾을 수 없을 것입니다.

3e 파티 구성 요소를 사용하고 싶지 않지만 AVICAP32.DLL을 사용하는 것이 더 좋은 옵션이라고 생각합니다.

이 페이지는 Windows에서 웹캠을 사용하는 가장 좋은 방법이며, 매우 안정적이며 캠 속성을 설정할 수 있습니다. 모든 오픈 소스, 사용하기 쉽고 기본 Windows DirectX 라이브러리를 기반으로합니다.

절 결코 실패하지 않았습니다.

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

행운과 재미를, 델파이 바위.