Http://soft.yesky.com/softchannel/72342371928440832/20040726/1834794.SHTML
Does your computer do not came to? See how others use QQ to play with the screen, will you think? Here is an easy implementation of the camera programming using Delphi using the Avicap32.dll using the MS. If you add your network programming level, you will not make any problems with a video chat.
Take a look at the code of the code below:
const WM_CAP_START = WM_USER; const WM_CAP_STOP = WM_CAP_START 68; const WM_CAP_DRIVER_CONNECT = WM_CAP_START 10; const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START 11; const WM_CAP_SAVEDIB = WM_CAP_START 25; const WM_CAP_GRAB_FRAME = WM_CAP_START 60; const WM_CAP_SEQUENCE = WM_CAP_START 62; const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START 20; const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START 63 const WM_CAP_SET_OVERLAY = WM_CAP_START 51 const WM_CAP_SET_PREVIEW = WM_CAP_START 50 const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START 6; const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START 2; const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START 3; const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START 5; const WM_CAP_SET_SCALE = WM_CAP_START 53 const WM_CAP_SET_PREVIEWRATE = WM_CAP_START 52 function capCreateCaptureWindowA (lpszWindowName: PCHAR; dwStyle: longint; x: integer; y: integer; nWidth: integer; nHeight: integer; ParentWin: HWND; nId: integer): HWND; STDCALL EXTERNAL 'AVICAP32. DLL ';
The above code is the definition of a function and constant of our main use.
Ok, open your Delphi, create a new project, add the definition above.
Create a window, put a panel, add a button, CAPTION set to "Start" Here you need to define a global variable, VAR HWNDC: THANDLE; the start button code is as follows:
beginhWndC: = capCreateCaptureWindowA ( 'My Own Capture Window', WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top, Panel1.Width, Panel1.Height, Form1.Handle, 0); hWndC: = capCreateCaptureWindowA ( 'My Own Capture Window' , WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top, Panel1.Width, Panel1.Height, Form1.Handle, 0); if hWndC <> 0 then beginSendMessage (hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage (hWndC, WM_CAP_SET_CALLBACK_ERROR , 0, 0); SendMessage (hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage (hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage (hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage (HWNDC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage (hwndc, wm_cap_set_preview, 1, 0); END; press F9 to run, how can you see the camera's view? How can I stop? Add a button CAPTION to "stop". The code is as follows: if hwndc <> 0 Then BegipmentMessage (hwndc, wm_cap_driver_disconnect, 0, 0); hwndc: = 0; End; Vision screen, how to save it? The following is saved in two ways, one is a BMP static diagram, one is an AVI animation.
On the three buttons to the form, CAPTION is set to "save BMP", "Start Recording", "Stop Recording", the code of the three buttons is as follows:
// save BMPif hWndC <> 0 then beginSendMessage (hWndC, WM_CAP_SAVEDIB, 0, longint (pchar ( 'c: /test.bmp'))); end; // start recording if hWndC <> 0 thenbeginSendMessage (hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, Longint (PCHAR ('c: /test.avi'))))))))))))); sendMessage (hwndc, wm_cap_sequence, 0, 0); end; // Stop recording if hwndc <> 0 THENSENDMESSAGE (hwndc, wm_cap_stop, 0, 0 END;
Run it again. . You can save a few pictures, you can also enjoy it after recording AVI. Program operation:
The complete program code is as follows:
unit Unit1; interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; typeTForm1 = class (TForm) Panel1: TPanel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton ; Button5: TButton; procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); procedure Button3Click (Sender: TObject); procedure Button4Click (Sender: TObject); procedure Button5Click (Sender: TObject); procedure FormClose (Sender: TObject; var Action: TCloseAction); privatehWndC: THandle; public {public declarations} end; varForm1: TForm1; const WM_CAP_START = WM_USER; const WM_CAP_STOP = WM_CAP_START 68; const WM_CAP_DRIVER_CONNECT = WM_CAP_START 10; const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START 11; const WM_CAP_SAVEDIB = WM_CAP_START 25; const WM_CAP_GRAB_FRAME = WM_CAP_START 60; const WM_CAP_SEQUENCE = WM_CAP_START 62; const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START 20; const WM_CAP_SEQUENCE_NOFILE = WM_CAP_START 63 const WM_CAP_SET_ OVERLAY = WM_CAP_START 51 const WM_CAP_SET_PREVIEW = WM_CAP_START 50 const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START 6; const WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START 2; const WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START 3; const WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START 5; const WM_CAP_SET_SCALE = WM_CAP_START 53 const WM_CAP_SET_PREVIEWRATE = WM_CAP_START 52 function capCreateCaptureWindowA ( Lpszwindowname: Pchar; DWStyle: long; x: integer; y: integer; nwidth: integer; nHEight: integer; parentwin: hwnd; nid: integer: hwnd; stdcall external 'avicap32.dll';
implementation {$ R * .dfm} procedure TForm1.Button1Click (Sender: TObject); beginhWndC: = capCreateCaptureWindowA ( 'My Own Capture Window', WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top, Panel1.Width, Panel1.Height, Form1.handle, 0); hwndc: = CapcreateCaptureWindowa ('My OWN Capture Window ", WS_CHILD OR WS_VISible, Panel1.Width, Panel1.Height, Form1.Handle, 0); if HWNDC <> 0 then beginSendMessage (hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); SendMessage (hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); SendMessage (hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage (hWndC, WM_CAP_SET_SCALE, 1, 0); SendMessage (hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); SendMessage (hWndC, WM_CAP_SET_OVERLAY, 1, 0); SendMessage (hWndC, WM_CAP_SET_PREVIEW, 1, 0); end; end; procedure TForm1.Button2Click (Sender : TOBJECT); Beginif HWNDC <> 0 THEN BeginsendMessage (hwndc, wm_cap_driver_disconnect, 0, 0); hWndc: = 0; end; end; procedure tform1.button3click (sender: Tobject); Beginif HW ndC <> 0 then beginSendMessage (hWndC, WM_CAP_SAVEDIB, 0, longint (pchar ( 'c: /test.bmp'))); end; end; procedure TForm1.Button4Click (Sender: TObject); beginif hWndC <> 0 thenbeginSendMessage ( hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, Longint (pchar ( 'c: /test.avi'))); SendMessage (hWndC, WM_CAP_SEQUENCE, 0, 0); end; end; procedure TForm1.Button5Click (Sender: TObject); beginif hWndC < > 0 then beginSendMessage (hWndC, WM_CAP_STOP, 0, 0); end; end; procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction); beginif hWndC <> 0 then beginSendMessage (hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); End; end; end. If the computer does not have a camera, you want to see the effect of the program, can you?
Of course, you can find a virtual camera, you can try SoftCam software. It is a veritable software camera. It can simulate "real" camera, remind you, don't use this Dongdong in QQ , MSN and other chat software deceive MM or GG. With regard to camera programming, you can also look at this group of VCL components: DSPACK, DSPack is a set of class and components that use Microsoft Direct Show and DirectX technology, design work in DirectX 9, support system Win9x, ME, 2000, and Windows XP.
Ok, let's introduce these. As for how the video screen is realized, you will see you, it is nothing more than the data compression to the other party. It is displayed, but it seems simple, it seems simple, it is still a bit difficult.
Source code download: