抓图程序开发实践
2010-05-12 20:35:23 来源:WEB开发网二、抓图程序
抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的DLL,登记热键
1. 添加hook.lib到工程里,在程序里给出两个DLL函数的定义,也可以写个头文件,再包含进来
BOOL __declspec(dllexport)__stdcall AddHotkey(HWND,UCHAR key,UCHAR mask);
BOOL __declspec(dllexport)__stdcall DeleteHotkey(HWND,UCHAR key,UCHAR mask);
也可以用动态载入的办法调用
2. 添加对热键通知事件的响应,程序中用的办法是重载WindowProc
LRESULT CCaptureDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_HOTKEY&&lParam==WM_KEYDOWN){ //lParam表示是按下还是松开,如果有多个热键,由wParam来区分
SaveBmp();
return FALSE;
}
…… //其它处理及默认处理
}
3. 保存屏幕
保存屏幕由函数SaveBmp完成,如下:
void CCaptureDlg::SaveBmp()
{
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
//bm.GetBitmapBits(size,lpData);//此函数在处理5-5-5模式的16位色下会出现颜色混乱
static int filecount=0;
CString name;
name.Format("pict%04d.bmp",filecount++);
name=m_Path+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
nCount++;
}
GlobalFreePtr(lpData);
if(nCount==1)
m_Number.Format("%d picture captured.",nCount);
else
m_Number.Format("%d pictures captured.",nCount);
UpdateData(FALSE);
}
4. 界面处理。该程序为了避免热键冲突,采用了动态设置热键的方法,具体界面上的东西,可以看源程序
源程序的编译与使用:先编译hook.dll并将其放在系统目录(win2000/NT是system32,98/ME是system)。
然后编译对话框程序运行即可!
本文配套源码
更多精彩
赞助商链接