2009-04-17 6 views
2

J'essaie d'obtenir des vignettes de fenêtres qui ne sont pas visibles.Get Thumbnail of fenêtre d'arrière-plan

Voici le code que j'ai jusqu'à présent

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

Pour l'instant, WindowProc est appelé directement à l'aide FindWindow pour obtenir une poignée, cependant, je veux éventuellement utiliser EnumWindows pour boucler à travers toutes les fenêtres pour obtenir leurs vignettes et les stocker dans une liste liée.

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

Ce code se trouve dans une DLL, appelée à partir d'une application C# Forms. Pour l'instant l'application C# prend juste le bitmap et l'enregistre dans un fichier. Le problème est que, à moins que j'utilise FindWindow pour obtenir la fenêtre visible (qui est aussi l'application C#), l'image finit par être une boîte noire.

Est-il possible d'obtenir une image d'une fenêtre d'arrière-plan?

EDIT: Ceci est une application Windows Mobile

+0

Avez-vous essayé d'appeler InvalidateRect() dans votre code pour forcer la fenêtre d'arrière-plan à se repeindre? – Kluge

+0

J'ai essayé d'appeler InvalidateRect avant d'obtenir le DC pour la fenêtre, et avant BitBlt. J'ai également essayé d'envoyer un message WM_PAINT, mais cela n'a pas non plus fait l'affaire. – zort15

Répondre

0

Il n'y a pas de redessiner passe pour Windows invisible, c'est pourquoi vous ne pouvez pas obtenir leur contenu à partir du DC. Essayez d'envoyer un message WM_PRINT à la fenêtre cible pour demander qu'elle dessine son contenu sur votre contrôleur de domaine.

Edit:

Désolé, je ne l'ai pas remarqué cela était pour Windows Mobile. Autre que WM_PRINT, je ne connais pas un moyen d'obtenir le contenu d'une fenêtre invisible. Bien sûr, vous pouvez toujours montrer la fenêtre (et assurez-vous qu'il est sur le dessus/non couvert par d'autres fenêtres) et ensuite exécuter le code que vous avez, mais c'est probablement un peu brouillon.

+0

Merci d'avoir répondu. Malheureusement, j'ai oublié de mentionner que j'écris ceci pour Windows Mobile, qui apparemment ne supporte pas le message WM_PRINT. Savez-vous s'il existe un équivalent Windows Mobile? J'ai fait des recherches sur Google, mais je n'en ai pas trouvé. – zort15