2011-06-05 99 views
0

以下代碼有什麼問題?爲什麼PrintWindow返回0?PrintWindow有什麼問題?

HWND hwnd = GetDesktopWindow(); 
CHK(hwnd); 

HDC hdc = GetWindowDC(hwnd); 
CHK(hdc); 

if (hdc) 
{ 
    HDC hdcMem = CreateCompatibleDC(hdc); 
    CHK(hdcMem); 

    if (hdcMem) 
    { 
     RECT rc; 
     CHK(GetWindowRect(hwnd, &rc)); 

     HBITMAP hbitmap = CreateCompatibleBitmap(hdc, rc.right-rc.left, rc.bottom-rc.top); 
     CHK(hbitmap); 

     if (hbitmap) 
     { 
      SelectObject(hdcMem, hbitmap); 

      CHK(PrintWindow(hwnd, hdcMem, 0)); //HERE return 0 

      DeleteObject(hbitmap); 
     } 

     DeleteObject(hdcMem); 
    } 

    ReleaseDC(hwnd, hdc); 
} 
+0

可能相關:http://stackoverflow.com/questions/26060746/general-capturing-with-wm-print-and-wm-printclient-supported-on-at-least-window。 – DuckMaestro 2015-02-02 17:13:26

回答

2

PrintWindow是一個相當薄的操作。它真正的作用是發送WM_PRINT消息到問題窗口的隊列中,在這種情況下是桌面,並希望該窗口將對WM_PRINT正確響應(請參閱herehere)。

我重申了你的行爲,但我不是100%確定它爲什麼失敗。也許你不能在HWND上調用PrintWindow你的進程不擁有,或者桌面不響應WM_PRINT消息。

上面的第二個鏈接包括有關使用BitBlt而不是評論:

嘗試獲得一個句柄(HWND)到 桌面窗口 - 並使用BitBlt到 捕獲所有內容。注意你 - 你只會捕獲在屏幕上可見的東西 。

也許這會有所幫助。

+0

您的第二個鏈接已損壞。由於它是「在這裏」,所以不能被其他人收回。 – Wolf 2015-09-23 11:10:49

0

替換:

HWND hwnd = GetDesktopWindow(); 

有了:

HWND hwnd = GetDesktopWindow(); 
hwnd = FindWindowEx(hwnd, 0, _T("Progman"), _T("Program Manager")); 

我不知道這是否讓你想要什麼,雖然。如果你想截取當前的整個桌面(包括任何頂級窗口都可見),那麼BitBlt就是你想要的路線。

如果你想獲得任務欄,你仍然可以使用這種方法,但你必須採取2個截圖並將結果拼接在一起。