WEB开发网
开发学院软件开发VC 抓图程序开发实践 阅读

抓图程序开发实践

 2010-05-12 20:35:23 来源:WEB开发网   
核心提示:二、抓图程序抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的DLL,抓图程序开发实践(3),登记热键1. 添加hook.lib到工程里,在程序里给出两个DLL函数的定义,具体界面上的东西,可以看源程序源程序的编译与使用:先编译hook.dll并将其放在系统目录(win2000/NT是system32,也可

二、抓图程序

抓图程序是一个基于对话框的程序,它在建立对话框的时候调用前面的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)。

然后编译对话框程序运行即可!

本文配套源码

上一页  1 2 3 

Tags:程序开发 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接