窗口截图
最近做了一个截图QQ火拼俄罗斯的程序,现在分享一下截屏的代码。
关于这个截取屏幕,是可以截取被遮挡住的窗口的。
采用了直接接管DC然后向指定的BUF上画图的办法。
想自己做一个QQ火拼俄罗斯的辅助程序,结果失败。最早就是考虑采用像素分析,不过,现在推翻了这样的做法。
目前正在用新的思路去写,不过麻烦很大呢,还在加油的做。
然后,最近在为今年的圣诞游戏做准备,努力的开发中,还回味了不少游戏。好啦,来看看这个截屏的代码吧:
C++代码
- void 截屏函数()
- {
- if(截屏窗口句柄 == NULL) return;
- if( !(::IsWindowVisible(截屏窗口句柄)) ) return;
- CRect r;
- if( 截屏窗口句柄 == NULL)
- {
- return;
- }
- ::GetWindowRect( 截屏窗口句柄 , r );
- HDC hDCMem = CreateCompatibleDC(NULL);
- HDC screenDC= ::GetDC(截屏窗口句柄);
- HBITMAP 截屏窗口图 = NULL;
- 截屏窗口图 = CreateCompatibleBitmap(screenDC, r.right – r.left, r.bottom – r.top);
- ::ReleaseDC(截屏窗口句柄, screenDC);
- HGDIOBJ hOld = SelectObject(hDCMem, 截屏窗口图);
- ::PrintWindow(截屏窗口句柄, hDCMem, 0);
- SelectObject(hDCMem, hOld);
- DeleteObject(hDCMem);
- //拷贝到剪贴板
- // ::OpenClipboard(m_hWnd);
- // EmptyClipboard();
- // SetClipboardData(CF_BITMAP, mTetrisBMP);
- // CloseClipboard();
- }
- //查询指定进程窗口句柄
- struct WNDENUMPARAM
- {
- DWORD ProcessID;
- HWND wnd;
- };
- BOOL CALLBACK wndenumproc(HWND hwnd,LPARAM param )
- {
- DWORD dwProcessId;
- GetWindowThreadProcessId( hwnd,&dwProcessId );
- if( ((WNDENUMPARAM*)param)->ProcessID == dwProcessId )
- {
- if( IsWindowVisible(hwnd) )
- {
- ((WNDENUMPARAM*)param)->wnd = hwnd;
- return FALSE;
- }
- }
- return TRUE;
- }
- HWND 查询句柄()
- {
- DWORD th32ProcessID = 0;
- HANDLE hSS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
- if( hSS != (HANDLE)-1 )
- {
- PROCESSENTRY32 me = { sizeof(me) };
- if( Process32First( hSS,&me ) )
- {
- do
- {
- _tcslwr(me.szExeFile);
- if( _tcsstr( me.szExeFile,L"进程名" ) )
- {
- th32ProcessID = me.th32ProcessID;
- break;
- }
- }while( Process32Next( hSS,&me ) );
- }
- CloseHandle( hSS );
- }
- if( th32ProcessID )
- {
- WNDENUMPARAM param = { th32ProcessID,0 };
- EnumWindows( wndenumproc,(LPARAM)¶m );
- if( param.wnd )
- return param.wnd;
- }
- return 0;
- }
Categories: Garfield's Diary