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);
  }
如果计算器没有被记本事挡住,那么得到的是正确的计算器界面。如果被挡住了
则得不到界面。
请问这个问题怎么解决?分数不多,谢谢大家关注!非常希望能帮我解决一下!
   

解决方案 »

  1.   


    根据你说的,我查了很多资料,然后把代码改为如下:
      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消息只有本应用程序内可以使用,要在别的程序使用只有通过注入的方式。我不知道代码该如何写。能说得详细点吗?最好给个例子谢谢!
      

  2.   

    注入方式源码:HWND hInputHandle=NULL;
    DWORD FormThreadID = GetCurrentThreadId(); // 本程序的线程ID
    DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);//当前窗口的线程ID
    // 附加输入线程
    AttachThreadInput(CWndThreadID, FormThreadID, true);  //附加输入线程
    hInputHandle = GetFocus();                  // 得到当前键盘光标所在的窗口
    AttachThreadInput(CWndThreadID, FormThreadID, false);   //取消
      

  3.   


    谢谢!不过问题还是没解决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);   //取消
    这样还是不行。
      

  4.   

    发送WM_PAINT的时候使目标窗口的指定区域无效呢
      

  5.   

    试试这个函数吧:PrintWindow
    之前我也遇到过类似的问题
    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
      

  6.   

    嘎嘎,突然发现精华区有人和你问的问题一样
    http://topic.csdn.net/u/20090306/02/098fa155-f62b-460f-8014-ed4cf501517a.html?70251
      

  7.   

    去看了一下,看到有人提出一个很不错的方法,hook窗口的处理函数,截获 WM_PAINT用自己的HDC代替
      

  8.   

    问题已解决。
    非常感谢chaojibenben,代码复制粘贴就能使用。要像chaojibenben这样写代码才能成功,如果直接写PrintWindow也是不行。
    分数不多,只能给一个人,给chaojibenben,因为他是最终解决问题的人。
    同时也非常感谢二楼的jameshooo,他提出发送WM_PRINT消息,虽然跨进程窗口不行,但在本进程窗口是可以的。这个知识也蛮有用的。
    感谢四楼的yeyanbin,给出C++的注入代码,虽然不成功,同样非常感谢!
    还有,感谢所有关注此问题的人!谢谢你们!