如何通过HOOK GDI函数实现后台截图? 200
后台截图的主要方法,一个是使用PrintWindow函数,这个相对比较好用,但有些Flash窗口或者视频窗口截到的图是黑屏,经研究无论如何也无法通过PrintWindow...
后台截图的主要方法,一个是使用PrintWindow函数,这个相对比较好用,但有些Flash窗口或者视频窗口截到的图是黑屏,经研究无论如何也无法通过PrintWindow函数成功截图。
另一个通常用GetWindowDC和BitBlt函数,将窗口DC复制到内存中再进行保存。反复测试(Win7 64Bit系统),基本上截到的图都是前台截图。目标窗口在前台,则可以成功截图,在后台为非活动窗口,则截到的图为目标窗口位置的前台截图。
所以想到了HOOK API函数截图。
经分析,Flash窗口调用了BitBlt函数,通过跟踪BitBlt函数发现,每次Flash调用BitBlt函数,都只是对一部分位图进行操作,仅仅是HOOK这个函数,并不能完整地获取整个后台窗口的截图。
请教下有何种方法能够实现对Flash窗口的后台截图(PrintWindow就不要说了。。。。。只对部分窗口有效),或者如果实现HOOK GDI函数实现后台截图? 展开
另一个通常用GetWindowDC和BitBlt函数,将窗口DC复制到内存中再进行保存。反复测试(Win7 64Bit系统),基本上截到的图都是前台截图。目标窗口在前台,则可以成功截图,在后台为非活动窗口,则截到的图为目标窗口位置的前台截图。
所以想到了HOOK API函数截图。
经分析,Flash窗口调用了BitBlt函数,通过跟踪BitBlt函数发现,每次Flash调用BitBlt函数,都只是对一部分位图进行操作,仅仅是HOOK这个函数,并不能完整地获取整个后台窗口的截图。
请教下有何种方法能够实现对Flash窗口的后台截图(PrintWindow就不要说了。。。。。只对部分窗口有效),或者如果实现HOOK GDI函数实现后台截图? 展开
1个回答
2015-07-22
展开全部
#define _WIN32_WINNT 0x0501 //仅XP或以上系统有效
#include <windows.h>
int main()
{
RECT rc;
HWND hwnd = FindWindow(TEXT("Notepad"), NULL); //注意窗口不能最小化
if (hwnd == NULL)
{
cout << "找不到记事本窗口" << endl;
return 0;
}
GetClientRect(hwnd, &rc);
//创建
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);
//复制
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
//PW_CLIENTONLY:Only the client area of the window is copied to hdcBlt.
//By default, the entire window is copied.
//PW_CLIENTONLY表示仅仅拷贝窗口的客户区域,而默认情况下,执行printwindow会拷贝整个窗口
//复制到粘贴板
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();
//释放
DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);
cout << "成功把记事本窗口复制到粘贴板,请粘贴到Windows画图工具" << endl;
return 0;
}
#include <windows.h>
int main()
{
RECT rc;
HWND hwnd = FindWindow(TEXT("Notepad"), NULL); //注意窗口不能最小化
if (hwnd == NULL)
{
cout << "找不到记事本窗口" << endl;
return 0;
}
GetClientRect(hwnd, &rc);
//创建
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);
//复制
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
//PW_CLIENTONLY:Only the client area of the window is copied to hdcBlt.
//By default, the entire window is copied.
//PW_CLIENTONLY表示仅仅拷贝窗口的客户区域,而默认情况下,执行printwindow会拷贝整个窗口
//复制到粘贴板
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();
//释放
DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);
cout << "成功把记事本窗口复制到粘贴板,请粘贴到Windows画图工具" << endl;
return 0;
}
追问
PrintWindow就不用说了,我一直用这个
部分Flash窗口用这个截到的图就是黑屏
回答等于没答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询