2009-04-17 9 views
2

Ich versuche, Thumbnail-Bilder von Fenstern, die nicht sichtbar sind, zu erhalten.Get Thumbnail des Hintergrundfensters

Hier ist der Code, den ich

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; 
} 

Vorerst bisher haben, WindowProc direkt FindWindow durch, die aufgerufen ist, einen Griff zu bekommen, ich EnumWindows eine Schleife durch alle Fenster aber schließlich verwenden möchten zu erhalten ihre Miniaturansichten und speichern Sie sie in einer verknüpften Liste.

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

Dieser Code ist in einer DLL, die aus einer C# Forms-Anwendung aufgerufen wird. Jetzt nimmt die C# -Anwendung nur die Bitmap und speichert sie in einer Datei.

Das Problem ist, dass, wenn ich FindWindow nicht verwenden, um das sichtbare Fenster zu erhalten (was auch zufällig die C# -Anwendung ist), das Bild endet, eine Blackbox zu sein.

Ist es möglich, ein Bild eines Hintergrundfensters zu erhalten?

EDIT: Dies ist ein Windows Mobile-Anwendung

+0

Haben Sie versucht, InvalidateRect() in Ihrem Code aufzurufen, um das Hintergrundfenster zu zwingen, sich neu zu streichen? – Kluge

+0

Ich habe versucht, InvalidateRect vor dem Abrufen der DC für das Fenster und vor BitBlt. Ich habe auch versucht, eine WM_PAINT-Nachricht zu senden, aber das hat auch nicht den Trick gemacht. – zort15

Antwort

0

Es gibt keine Neuzeichnung für unsichtbare Fenster los ist, das ist, warum Sie uns ihre Inhalte nicht aus dem DC bekommen. Versuchen Sie, eine WM_PRINT Nachricht an das Zielfenster zu senden, um anzufordern, dass es seinen Inhalt an Ihr DC zieht.

Edit:

Sorry, ich habe dies für Windows Mobile nicht bemerkt wurde. Anders als WM_PRINT weiß ich nicht, wie ich den Inhalt eines unsichtbaren Fensters erhalten kann. Natürlich können Sie das Fenster immer noch anzeigen (und sicherstellen, dass es oben/nicht durch andere Fenster abgedeckt ist) und dann den Code ausführen, den Sie haben, aber das ist wahrscheinlich ein bisschen unordentlich.

+0

Vielen Dank für Ihre Antwort. Unglücklicherweise habe ich nicht erwähnt, dass ich dies für Windows Mobile schreibe, das die WM_PRINT-Nachricht anscheinend nicht unterstützt. Weißt du, ob es ein Windows Mobile-Äquivalent gibt? Ich habe gegoogelt, aber ich konnte keinen finden. – zort15