2009-04-17 85 views
2

我正在嘗試獲取不可見的窗口的縮略圖圖片。獲取背景窗口的縮略圖

這裏是我到目前爲止

BOOL CALLBACK WindowProc(HWND hWnd, LPARAM lParam) 
{ 
    RECT WindRect; 
    GetWindowRect(hWnd, &WindRect) 
    CurrentScreenShot->Next = new ScreenShotList(); 
    CurrentScreenShot = CurrentScreenShot->Next; 

    HDC SourceDC = GetDC(hWnd); 
    HDC TargetDC = CreateCompatibleDC(SourceDC); 
    CurrentScreenShot->ScreenShot = CreateCompatibleBitmap(SourceDC, WindRect.right - WindRect.left, WindRect.bottom - WindRect.top); 

    BitBlt(TargetDC, 0, 0, WindRect.right - WindRect.left, WindRect.bottom - WindRect.top, SourceDC, 0, 0, SRCCOPY); 

    ReleaseDC(hWnd, SourceDC); 

    g_iWindows++; 
    return TRUE; 
} 

對於現在的代碼,WindowProc是使用FindWindow獲得一個句柄直接調用,不過,我最終想要使用EnumWindows遍歷所有的窗口來獲得他們的縮略圖並將它們存儲在鏈接列表中。

WindowProc(FindWindow(NULL, L"File Explorer"), 0); 

此代碼位於DLL中,該DLL從C#Forms應用程序調用。目前,C#應用程序只是獲取位圖並將其保存到文件中。

問題是,除非我使用FindWindow來獲得可見窗口(這也恰好是C#應用程序),圖片最終成爲一個黑盒子。

是否有可能獲得背景窗口的圖片?

編輯:這是Windows Mobile應用程序

+0

您是否試過在代碼中調用InvalidateRect()來強制背景窗口重新繪製自己? – Kluge 2009-04-17 16:52:02

+0

我已經嘗試在獲取窗口DC之前以及BitBlt之前調用InvalidateRect。我也嘗試發送一條WM_PAINT消息,但這也沒有辦法。 – zort15 2009-04-20 16:36:55

回答

0

沒有重繪不可見的Windows回事,這就是爲什麼你不能讓從DC他們的內容。嘗試發送WM_PRINT消息到目標窗口,請求將其內容提交給您的DC。

編輯:

對不起,我沒有注意到這是爲Windows Mobile。除WM_PRINT以外,我不知道獲取隱藏窗口內容的方法。當然,你仍然可以顯示窗口(並確保它在最上面/未被其他窗口覆蓋),然後運行你的代碼,但這可能有點混亂。