以下是源代码: 当加上这句后程序就出错
SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack));我是照书上抄的例子,FrameCallBack:这个是帧的回调过程
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,VFW;type
TForm1 = class(TForm)
PnV1: TPanel;
PnV2: TPanel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
dc:HDC;
hdd:HDRAWDIB;
BmpInfo,BmpInfo1:BITMAPINFO;
hWndc:Thandle;
Data:Pchar;
procedure SetBmpInfo1();
procedure ShowDib();
end;var
Form1: TForm1;
//function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;
function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;
implementation{$R *.dfm}{ TForm1 }procedure TForm1.SetBmpInfo1;
begin
BmpInfo1.bmiHeader.biSize:=sizeof(BITMAPINFO);
BmpInfo1.bmiHeader.biWidth:=176;
BmpInfo1.bmiHeader.biHeight:=144;
BmpInfo1.bmiHeader.biPlanes:=1;
BmpInfo1.bmiHeader.biBitCount:=12;
BmpInfo1.bmiHeader.biCompression:=808596553;
BmpInfo1.bmiHeader.biSizeImage:=38016;
BmpInfo1.bmiHeader.biXPelsPerMeter:=176;
BmpInfo1.bmiHeader.biYPelsPerMeter:=144;
BmpInfo1.bmiHeader.biClrUsed:=0;
BmpInfo1.bmiHeader.biClrImportant:=0;
end;procedure TForm1.ShowDib;
begin
DrawDibDraw(hdd,dc,0,0,PnV2.Width,PnV2.Height,addr(BmpInfo1),Data,0,0,-1,-1,0);
end;function FrameCallBack(hWnd:HWND;lpVHdr: Integer):boolean;stdcall;
var
VideoStr:PVIDEOHDR;
nn:Integer;
begin
VideoStr:=PVIDEOHDR(lpVHdr);
nn:=VideoStr^.dwBufferLength;
CopyMemory(form1.Data,VideoStr^.lpData,nn);
form1.ShowDib();
Result:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
self.SetBmpInfo1();
dc:=GetDC(PnV2.Handle);
hdd:=DrawDibOpen();
if hdd=null then
memo1.Lines.add('no hdd');
GetMem(Data,140000);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hWndc<>0 then
begin
SendMessage(hWndc,WM_CAP_DRIVER_DISCONNECT,0,0);
end;
FreeMem(Data);
DrawDibClose(hdd);
end;procedure TForm1.Button1Click(Sender: TObject);
var
nn:integer;
dwSize:DWORD;
begin
hWndC:=capCreateCaptureWindowA('Capture Window',WS_CHILD or WS_VISIBLE,PnV1.Left,PnV1.Top,PnV1.Width,PnV1.Height,form1.Handle,0);
if hWndc<>0 then
begin
SendMessage(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, 80, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack)); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); dwSize:=capGetVideoFormatSize(hWndC);
capGetVideoFormat(hWndC, Addr(BmpInfo), dwSize);
nn:=BmpInfo.bmiHeader.biWidth;
Memo1.Lines.Add('width='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biXPelsPerMeter;
Memo1.Lines.Add('biXPelsPerMeter='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biHeight;
Memo1.Lines.Add('height='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biYPelsPerMeter;
Memo1.Lines.Add('biYPelsPerMeter='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biBitCount;
Memo1.Lines.Add('biBitCount='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biSizeImage;
Memo1.Lines.Add('biSizeImage='+IntToStr(nn));
end;
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.
SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack));我是照书上抄的例子,FrameCallBack:这个是帧的回调过程
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,VFW;type
TForm1 = class(TForm)
PnV1: TPanel;
PnV2: TPanel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
dc:HDC;
hdd:HDRAWDIB;
BmpInfo,BmpInfo1:BITMAPINFO;
hWndc:Thandle;
Data:Pchar;
procedure SetBmpInfo1();
procedure ShowDib();
end;var
Form1: TForm1;
//function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;
function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;
implementation{$R *.dfm}{ TForm1 }procedure TForm1.SetBmpInfo1;
begin
BmpInfo1.bmiHeader.biSize:=sizeof(BITMAPINFO);
BmpInfo1.bmiHeader.biWidth:=176;
BmpInfo1.bmiHeader.biHeight:=144;
BmpInfo1.bmiHeader.biPlanes:=1;
BmpInfo1.bmiHeader.biBitCount:=12;
BmpInfo1.bmiHeader.biCompression:=808596553;
BmpInfo1.bmiHeader.biSizeImage:=38016;
BmpInfo1.bmiHeader.biXPelsPerMeter:=176;
BmpInfo1.bmiHeader.biYPelsPerMeter:=144;
BmpInfo1.bmiHeader.biClrUsed:=0;
BmpInfo1.bmiHeader.biClrImportant:=0;
end;procedure TForm1.ShowDib;
begin
DrawDibDraw(hdd,dc,0,0,PnV2.Width,PnV2.Height,addr(BmpInfo1),Data,0,0,-1,-1,0);
end;function FrameCallBack(hWnd:HWND;lpVHdr: Integer):boolean;stdcall;
var
VideoStr:PVIDEOHDR;
nn:Integer;
begin
VideoStr:=PVIDEOHDR(lpVHdr);
nn:=VideoStr^.dwBufferLength;
CopyMemory(form1.Data,VideoStr^.lpData,nn);
form1.ShowDib();
Result:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
self.SetBmpInfo1();
dc:=GetDC(PnV2.Handle);
hdd:=DrawDibOpen();
if hdd=null then
memo1.Lines.add('no hdd');
GetMem(Data,140000);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if hWndc<>0 then
begin
SendMessage(hWndc,WM_CAP_DRIVER_DISCONNECT,0,0);
end;
FreeMem(Data);
DrawDibClose(hdd);
end;procedure TForm1.Button1Click(Sender: TObject);
var
nn:integer;
dwSize:DWORD;
begin
hWndC:=capCreateCaptureWindowA('Capture Window',WS_CHILD or WS_VISIBLE,PnV1.Left,PnV1.Top,PnV1.Width,PnV1.Height,form1.Handle,0);
if hWndc<>0 then
begin
SendMessage(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, 80, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack)); SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); dwSize:=capGetVideoFormatSize(hWndC);
capGetVideoFormat(hWndC, Addr(BmpInfo), dwSize);
nn:=BmpInfo.bmiHeader.biWidth;
Memo1.Lines.Add('width='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biXPelsPerMeter;
Memo1.Lines.Add('biXPelsPerMeter='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biHeight;
Memo1.Lines.Add('height='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biYPelsPerMeter;
Memo1.Lines.Add('biYPelsPerMeter='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biBitCount;
Memo1.Lines.Add('biBitCount='+IntToStr(nn));
nn:=BmpInfo.bmiHeader.biSizeImage;
Memo1.Lines.Add('biSizeImage='+IntToStr(nn));
end;
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.
function FrameCallBack(hWnd:HWND;lpVHdr: PVIDEOHDR):boolean;stdcall;
begin
with Form1 do
begin
DrawDibDraw(hdd,
dc,
0,
0,
PnV2.Width,
PnV2.Height,
@BmpInfo.bmiHeader,
lpVHdr^.lpData,
0,
0,
-1,
-1,
0);
end;
Result:=true;
end;CSDN论坛浏览器:http://CoolSlob.ys168.com/
ICCompressBegin
ICCompress
ICCompressEnd
解压
ICDecompressBegin
ICDecompress
ICDecompressEnd ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY);
得到HIC列表
ICGetInfo得到HIC列表详细信息,设置好输出格式,就可以了