1、目标窗口是被盖住的,例如计算器界面被记事本挡住了。
2、不可以把目标窗口(计算器)移到最前,瞬间也不可以。因为那样不是想要的效果。
3、把计算器界面截获下来,我编的代码如下:
HDC hDC = NULL;
HWND hWnd = NULL;
hWnd = ::FindWindow(NULL,"计算器");
if (hWnd!=NULL)
{
hDC = ::GetDC(hWnd);
//CDC m_memDC; //在其它地方定义,保存目标DC的拷贝
::BitBlt(m_memDC.m_hDC,0,0,50,50,hDC,0,0,SRCCOPY);
}
如果计算器没有被记本事挡住,那么得到的是正确的计算器界面。如果被挡住了
则得不到界面。
请问这个问题怎么解决?分数不多,谢谢大家关注!非常希望能帮我解决一下!
2、不可以把目标窗口(计算器)移到最前,瞬间也不可以。因为那样不是想要的效果。
3、把计算器界面截获下来,我编的代码如下:
HDC hDC = NULL;
HWND hWnd = NULL;
hWnd = ::FindWindow(NULL,"计算器");
if (hWnd!=NULL)
{
hDC = ::GetDC(hWnd);
//CDC m_memDC; //在其它地方定义,保存目标DC的拷贝
::BitBlt(m_memDC.m_hDC,0,0,50,50,hDC,0,0,SRCCOPY);
}
如果计算器没有被记本事挡住,那么得到的是正确的计算器界面。如果被挡住了
则得不到界面。
请问这个问题怎么解决?分数不多,谢谢大家关注!非常希望能帮我解决一下!
根据你说的,我查了很多资料,然后把代码改为如下:
HWND hWnd = NULL;
hWnd = ::FindWindow(NULL,"计算器");
if (hWnd!=NULL)
{
//CDC m_memDC; //在其它地方定义,保存目标DC的拷贝
::SendMessage(hWnd,WM_PRINT,(WPARAM)m_memDC.m_hDC,PRF_CLIENT | PRF_NONCLIENT | PRF_ERASEBKGND | PRF_CHILDREN);
} 依然是获取不到目标窗口内容。我还了解到WM_PRINT消息只有本应用程序内可以使用,要在别的程序使用只有通过注入的方式。我不知道代码该如何写。能说得详细点吗?最好给个例子谢谢!
DWORD FormThreadID = GetCurrentThreadId(); // 本程序的线程ID
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);//当前窗口的线程ID
// 附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true); //附加输入线程
hInputHandle = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); //取消
谢谢!不过问题还是没解决HWND hInputHandle=NULL;
DWORD FormThreadID = GetCurrentThreadId(); // 本程序的线程ID
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);//当前窗口的线程ID
// 附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true); //附加输入线程
::PostMessage(hWnd,WM_PRINT,(WPARAM)m_memDC.m_hDC,PRF_CLIENT | PRF_NONCLIENT | PRF_CHILDREN);
AttachThreadInput(CWndThreadID, FormThreadID, false); //取消
这样还是不行。
之前我也遇到过类似的问题
typedef BOOL (WINAPI *PrintWindowFunc)(
HWND hwnd, // Window to copy
HDC hdcBlt, // HDC to print into
UINT nFlags // Optional flags
);
PrintWindowFunc pPrintWindow = (PrintWindowFunc) GetProcAddress( GetModuleHandle(L"user32.dll"), "PrintWindow");
(*pPrintWindow)(hWnd , memDCWnd, 0x01); // PW_CLIENTONLY
http://topic.csdn.net/u/20090306/02/098fa155-f62b-460f-8014-ed4cf501517a.html?70251
非常感谢chaojibenben,代码复制粘贴就能使用。要像chaojibenben这样写代码才能成功,如果直接写PrintWindow也是不行。
分数不多,只能给一个人,给chaojibenben,因为他是最终解决问题的人。
同时也非常感谢二楼的jameshooo,他提出发送WM_PRINT消息,虽然跨进程窗口不行,但在本进程窗口是可以的。这个知识也蛮有用的。
感谢四楼的yeyanbin,给出C++的注入代码,虽然不成功,同样非常感谢!
还有,感谢所有关注此问题的人!谢谢你们!