Menu

窗口截图

最近做了一个截图QQ火拼俄罗斯的程序,现在分享一下截屏的代码。

关于这个截取屏幕,是可以截取被遮挡住的窗口的。

采用了直接接管DC然后向指定的BUF上画图的办法。

想自己做一个QQ火拼俄罗斯的辅助程序,结果失败。最早就是考虑采用像素分析,不过,现在推翻了这样的做法。

目前正在用新的思路去写,不过麻烦很大呢,还在加油的做。

然后,最近在为今年的圣诞游戏做准备,努力的开发中,还回味了不少游戏。好啦,来看看这个截屏的代码吧:

C++代码
        

  1. void 截屏函数()  
  2.     

  3. {  
  4.     

  5.     if(截屏窗口句柄 == NULL) return;  
  6.     

  7.     if( !(::IsWindowVisible(截屏窗口句柄)) ) return;  
  8.     

  9.   
  10.     

  11.     CRect r;  
  12.     

  13.     if( 截屏窗口句柄 == NULL)  
  14.     

  15.     {  
  16.     

  17.         return;  
  18.     

  19.     }  
  20.     

  21.   
  22.     

  23.     ::GetWindowRect( 截屏窗口句柄 , r );  
  24.     

  25.     HDC hDCMem = CreateCompatibleDC(NULL);  
  26.     

  27.     HDC screenDC= ::GetDC(截屏窗口句柄);  
  28.     

  29.   
  30.     

  31.     HBITMAP 截屏窗口图 = NULL;  
  32.     

  33.   
  34.     

  35.     截屏窗口图 = CreateCompatibleBitmap(screenDC, r.right – r.left, r.bottom – r.top);  
  36.     

  37.   
  38.     

  39.     ::ReleaseDC(截屏窗口句柄, screenDC);  
  40.     

  41.   
  42.     

  43.     HGDIOBJ hOld = SelectObject(hDCMem, 截屏窗口图);  
  44.     

  45.     ::PrintWindow(截屏窗口句柄, hDCMem, 0);  
  46.     

  47.     SelectObject(hDCMem, hOld);  
  48.     

  49.     DeleteObject(hDCMem);  
  50.     

  51.   
  52.     

  53.     //拷贝到剪贴板  
  54.     

  55.     //  ::OpenClipboard(m_hWnd);  
  56.     

  57.     //  EmptyClipboard();  
  58.     

  59.     //  SetClipboardData(CF_BITMAP, mTetrisBMP);  
  60.     

  61.     //  CloseClipboard();  
  62.     

  63. }  
  64.     

  65.   
  66.     

  67. //查询指定进程窗口句柄  
  68.     

  69. struct WNDENUMPARAM  
  70.     

  71. {  
  72.     

  73.     DWORD ProcessID;  
  74.     

  75.     HWND  wnd;  
  76.     

  77. };  
  78.     

  79.   
  80.     

  81. BOOL CALLBACK wndenumproc(HWND hwnd,LPARAM param )  
  82.     

  83. {  
  84.     

  85.     DWORD dwProcessId;  
  86.     

  87.     GetWindowThreadProcessId( hwnd,&dwProcessId );  
  88.     

  89.     if( ((WNDENUMPARAM*)param)->ProcessID == dwProcessId )  
  90.     

  91.     {  
  92.     

  93.         if( IsWindowVisible(hwnd) )  
  94.     

  95.         {  
  96.     

  97.             ((WNDENUMPARAM*)param)->wnd = hwnd;  
  98.     

  99.             return FALSE;  
  100.     

  101.         }  
  102.     

  103.     }  
  104.     

  105.     return TRUE;  
  106.     

  107. }  
  108.     

  109.   
  110.     

  111. HWND 查询句柄()  
  112.     

  113. {    
  114.     

  115.     DWORD th32ProcessID = 0;  
  116.     

  117.   
  118.     

  119.     HANDLE hSS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  120.     

  121.     if( hSS != (HANDLE)-1 )  
  122.     

  123.     {  
  124.     

  125.         PROCESSENTRY32 me = { sizeof(me) };  
  126.     

  127.         if( Process32First( hSS,&me ) )  
  128.     

  129.         {  
  130.     

  131.             do  
  132.     

  133.             {  
  134.     

  135.                 _tcslwr(me.szExeFile);  
  136.     

  137.                 if( _tcsstr( me.szExeFile,L"进程名" ) )  
  138.     

  139.                 {  
  140.     

  141.                     th32ProcessID = me.th32ProcessID;  
  142.     

  143.                     break;  
  144.     

  145.                 }  
  146.     

  147.             }while( Process32Next( hSS,&me ) );  
  148.     

  149.         }  
  150.     

  151.         CloseHandle( hSS );  
  152.     

  153.     }  
  154.     

  155.   
  156.     

  157.     if( th32ProcessID )  
  158.     

  159.     {  
  160.     

  161.         WNDENUMPARAM param = { th32ProcessID,0 };  
  162.     

  163.         EnumWindows( wndenumproc,(LPARAM)&param );  
  164.     

  165.         if( param.wnd )  
  166.     

  167.             return param.wnd;  
  168.     

  169.     }  
  170.     

  171.     return 0;  
  172.     

  173.   
  174.     

  175. }  

Categories:   Garfield's Diary

Comments