信息来源:无花果http://www.cnasm.com/
#include
#include
#include
#pragmacomment(lib,"vfw32.lib")
HWNDghWndCap;//捕获窗的句柄
CAPDRIVERCAPSgCapDriverCaps;//视频驱动器的能力
CAPSTATUSgCapStatus;//捕获窗的状态
charszCaptureFile[]="MYCAP.AVI";
chargachBuffer[20];
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKStatusCallbackProc(HWNDhWnd,intnID,LPSTRlpStatusText)
{
if(!ghWndCap)returnFALSE;//获得捕获窗的状态
capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS));//更新捕获窗的大小
SetWindowPos(ghWndCap,NULL,0,0,gCapStatus.uiImageWidth,gCapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
if(nID==0){//清除旧的状态信息
SetWindowText(ghWndCap,(LPSTR)"hello");
return(LRESULT)TRUE;
}//显示状态ID和状态文本
wsprintf(gachBuffer,"Status#%d:%s",nID,lpStatusText);
SetWindowText(ghWndCap,(LPSTR)gachBuffer);
return(LRESULT)TRUE;
}
LRESULTCALLBACKErrorCallbackProc(HWNDhWnd,intnErrID,LPSTRlpErrorText)
{
if(!ghWndCap)returnFALSE;
if(nErrID==0)returnTRUE;//清除旧的错误
wsprintf(gachBuffer,"Error#%d",nErrID);//显示错误标识和文本
MessageBox(hWnd,lpErrorText,gachBuffer,MB_OK|MB_ICONEXCLAMATION);
return(LRESULT)TRUE;
}
LRESULTCALLBACKFrameCallbackProc(HWNDhWnd,LPVIDEOHDRlpVHdr)
{
FILE*fp;
fp=fopen("caram.dat","w");
if(!ghWndCap)returnFALSE;//假设fp为一打开的.dat文件指针
fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp);
return(LRESULT)TRUE;
}
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)
{
staticTCHARszAppName[]=TEXT("HelloWin");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("ThisprogramrequiresWindowsNT!"),szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,TEXT("TheHelloProgram"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;
PAINTSTRUCTps;
RECTrect;
switch(message)
{
caseWM_CREATE:
{
ghWndCap=capCreateCaptureWindow((LPSTR)"CaptureWindow",WS_CHILD|WS_VISIBLE,0,0,300,240,(HWND)hwnd,(int)0);
capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);
capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc);
capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);
capDriverConnect(ghWndCap,0);//将捕获窗同驱动器连接
//获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中
capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS));
capPreviewRate(ghWndCap,66);//设置Preview模式的显示速率
capPreview(ghWndCap,TRUE);//启动Preview模式
if(gCapDriverCaps.fHasOverlay)//检查驱动器是否有叠加能力
capOverlay(ghWndCap,TRUE);//启动Overlay模式
if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap);//Videosource对话框
if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap);//Videoformat对话框
if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap);//Videodisplay对话框
capFileSetCaptureFile(ghWndCap,szCaptureFile);//指定捕获文件名
capFileAlloc(ghWndCap,(1024L*1024L*5));//为捕获文件分配存储空间
capCaptureSequence(ghWndCap);//开始捕获视频序列
capGrabFrame(ghWndCap);//捕获单帧图像
}
return0;
caseWM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Windows98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return0;
caseWM_DESTROY:
{
capSetCallbackOnStatus(ghWndCap,NULL);
capSetCallbackOnError(ghWndCap,NULL);
capSetCallbackOnFrame(ghWndCap,NULL);
capCaptureAbort(ghWndCap);//停止捕获
capDriverDisconnect(ghWndCap);//将捕获窗同驱动器断开
PostQuitMessage(0);
}
return0;
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}