![]() |
Frage zu WM_CAP_FILE_SAVEDIB
Hallo!
Ja, schon wieder ein Thread zum Thema Video-Capturing. Sorry. ;) Zur Zeit bin ich dabei, meine im Studium gesammelten Delphi-Kenntnisse wieder ein wenig aufzufrischen. Wir haben dort nur ein wenig die Grundlagen gelernt, daher würde ich mich immernoch als blutigen Anfänger bezeichnen. Daher bitte ich um Gnade. ;) Also. Mein Programm soll eigentlich nur ein Video-Bild anzeigen und man soll per Knopfdruck einen Screenshot machen. Das Video wird skaliert auf einem Panel angezeigt, was soweit auch prima funktioniert. Nun könnte ich natürlich via WM_CAP_EDIT_COPY das Bild in die Zwischenablage kopieren. Das funktioniert auch. Allerdings möchte ich die Zwischenablage gerne unangetastet lassen und das Bild direkt auf die Festplatte speichern. Ich habe hier im Forum dann die ![]() ![]() Ach ja, hier noch mein (aus verschiedenen Beispielen zusammengeklauter ;)) Code. Geschrieben in Delphi 2005 PE.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, XPMan; type TForm1 = class(TForm) Panel1: TPanel; Button3: TButton; Button4: TButton; Button5: TButton; XPManifest1: TXPManifest; Button6: TButton; Image1: TImage; procedure Button6Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Handle: HWND; end; var Form1: TForm1; const WM_CAP_DRIVER_CONNECT = WM_USER + 10; WM_CAP_DRIVER_DISCONNECT = WM_USER + 11; WM_CAP_EDIT_COPY = WM_USER + 30; WM_CAP_SET_OVERLAY = WM_USER + 51; WM_CAP_SET_PREVIEWRATE = WM_USER + 52; WM_CAP_DLG_VIDEOFORMAT = WM_USER + 41; WM_CAP_DLG_VIDEOSOURCE = WM_USER + 42; WM_CAP_FILE_SAVEDIB = WM_USER + 25; WM_CAP_DLG_VIDEODISPLAY = WM_USER + 43; WM_CAP_FILE_SET_CAPTURE_FILE = WM_USER + 44; implementation {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: PChar; dwStyle,x,y,nWidth,nHeight: Integer; hWndParent: HWND; nID: Integer): HWND; stdcall; external 'avicap32.dll' name 'capCreateCaptureWindowA'; procedure TForm1.Button3Click(Sender: TObject); begin SendMessage(handle,WM_CAP_DLG_VIDEOFORMAT,1,0); end; procedure TForm1.Button4Click(Sender: TObject); begin //Hier soll ein Screenshot erzeugt werden. //SendMessage(handle, WM_CAP_FILE_SAVEDIB, 0, 0); end; procedure TForm1.Button5Click(Sender: TObject); begin SendMessage(handle,WM_CAP_DLG_VIDEOSOURCE,1,0); end; procedure TForm1.FormCreate(Sender: TObject); begin Handle := capCreateCaptureWindow('Video1',WS_VISIBLE + WS_CHILD,0,0,160, 120,Panel1.Handle,1); if Handle = 0 then begin Exit; end; if SendMessage(Handle,WM_CAP_DRIVER_CONNECT,0,0) = 0 then begin DestroyWindow(Handle); Handle := 0; Exit; end; SendMessage(handle, WM_CAP_DRIVER_CONNECT,0,0); SendMessage(handle, WM_CAP_SET_PREVIEWRATE,30,0); sendMessage(handle, WM_CAP_SET_OVERLAY,1,0); end; procedure TForm1.Button6Click(Sender: TObject); begin SendMessage(handle, WM_CAP_DLG_VIDEODISPLAY,0,0); //Funktioniert nicht. end; end. |
Re: Frage zu WM_CAP_FILE_SAVEDIB
![]() Da hat Luckie mal nen Link zu ner Seite gepostet, auf ders Archive gibt, in denen u.a. diese Datei drin ist, dann musst du nicht mehr mit Sendmessage arbeiten, sondern kannst gleich die passenden Funktionen verwenden. Dann kannst du auch ![]() ![]() ![]() und vermutlich ![]() verwenden ;) //edit Fast vergessen: :thumb: :thumb: :dp: :party: Herzlich Willkommen hier :party: :dp: :thumb: :thumb: |
Re: Frage zu WM_CAP_FILE_SAVEDIB
Vielen Dank. Hab mir die Files mal runtergeladen. Nun muss ich erstmal den Code zerpflücken und schauen, was ich davon überhaupt brauche. ;)
|
Re: Frage zu WM_CAP_FILE_SAVEDIB
So, ich hab jetzt 'nen Haufen Sourcecodes durchgelesen, aber irgendwie komme ich auf keinen grünen Zweig. Ich habe diverse Varianten ausprobiert und Delphi hat noch nichteinmal gemeckert. Aber ein Screenshot hat's trotzdem nicht produziert. :( Ich werd beizeiten noch ein wenig rumprobieren. Aber falls jemand noch irgendwelche Tips oder Lösungsvorschläge hat, dan wäre ich sehr dankbar.
:cyclops: |
Re: Frage zu WM_CAP_FILE_SAVEDIB
So, es klappt. Vielen Dank nochmal! :-D
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, XPMan; type TForm1 = class(TForm) Panel1: TPanel; Button3: TButton; Button4: TButton; Button5: TButton; XPManifest1: TXPManifest; Button6: TButton; Image1: TImage; procedure Button6Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Handle : HWND; FCapWnd: HWnd; end; var Form1: TForm1; ghCapWnd: THandle; gCapSingleImageFileName : string; const WM_CAP_DRIVER_CONNECT = WM_USER + 10; WM_CAP_DRIVER_DISCONNECT = WM_USER + 11; WM_CAP_EDIT_COPY = WM_USER + 30; WM_CAP_SET_OVERLAY = WM_USER + 51; WM_CAP_SET_PREVIEWRATE = WM_USER + 52; WM_CAP_DLG_VIDEOFORMAT = WM_USER + 41; WM_CAP_DLG_VIDEOSOURCE = WM_USER + 42; WM_CAP_FILE_SAVEDIB = WM_USER + 25; WM_CAP_DLG_VIDEODISPLAY = WM_USER + 43; WM_CAP_FILE_SET_CAPTURE_FILE = WM_USER + 44; WM_CAP_GRAB_FRAME = WM_USER + 60; implementation {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: PChar; dwStyle,x,y,nWidth,nHeight: Integer; hWndParent: HWND; nID: Integer): HWND; stdcall; external 'avicap32.dll' name 'capCreateCaptureWindowA'; function AVICapSM(hwnd: HWND; m: UINT; w: WPARAM; l: LPARAM): DWORD; begin if IsWindow(hwnd) then Result := SendMessage(hwnd,m,w,l) else Result := 0; end; function capFileSaveDIB(hwnd: HWND; szName: LPCSTR): BOOL; begin Result := AVICapSM(hwnd, WM_CAP_FILE_SAVEDIB, 0, LPARAM(szName)) <> 0; end; procedure TForm1.Button3Click(Sender: TObject); begin SendMessage(handle,WM_CAP_DLG_VIDEOFORMAT,1,0); end; procedure TForm1.Button4Click(Sender: TObject); var FileName: String; begin capFileSaveDIB(handle, PChar('test.bmp')); end; procedure TForm1.Button5Click(Sender: TObject); begin SendMessage(handle,WM_CAP_DLG_VIDEOSOURCE,1,0); end; procedure TForm1.FormCreate(Sender: TObject); begin Handle := capCreateCaptureWindow('Video1',WS_VISIBLE + WS_CHILD,0,0,160, 120,Panel1.Handle,1); if Handle = 0 then begin Exit; end; if SendMessage(Handle,WM_CAP_DRIVER_CONNECT,0,0) = 0 then begin DestroyWindow(Handle); Handle := 0; Exit; end; SendMessage(handle, WM_CAP_DRIVER_CONNECT,0,0); SendMessage(handle, WM_CAP_SET_PREVIEWRATE,30,0); sendMessage(handle, WM_CAP_SET_OVERLAY,1,0); end; procedure TForm1.Button6Click(Sender: TObject); begin SendMessage(handle, WM_CAP_DLG_VIDEODISPLAY,0,0); //Funktioniert nicht. end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz