Y
Wenn es minimiert oder gar versteckt ist, wird es natürlich schwer, ansonsten bietet sich PrintWindow an (funktioniert bei mir zumindest unter XP auch bei verdeckten Fenstern reibungslos).
Da ich auch etwas an diesem Thema interessiert bin, habe ich mal ein wenig rumgespielt:
Natürlich kannst du nicht die WM_MOUSEMOVE und WM_LBUTTON..-Nachrichten direkt senden, stattdessen musst du einen Umweg um selbstdefinierte Nachrichten gehen.
Der LPARAM, also die Cursorkoordinaten müssen natürlich umgerechnet werden. Das heißt, falls das Fenster auch noch einen Rahmen hat, müssten mittels GetSystemMetrics die x- (SM_CXBORDER) und y-Koordinate (SM_CYCAPTION) verändert und der geänderte LPARAM als z.B.
msg-WM_MOUSEMOVE+WM_USER
gesendet werden.
Die Anwendung, die diese WM_USER-Nachrichten empfängt, müsste nun ihrerseits das betroffene Childfenster bestimmen (ChildWindowFromPoint), und die Nachricht wieder als WM_MOUSEMOVE bzw. WM_L/R_BUTTON.. an das Control senden.
Mit selbstdefinierten Controls hat das bei mir alles wunderbar geklappt, Windows hat aber noch eine zusätzliche Logik, wahrscheinlich werden WM_LBUTTON..-Nachrichten nur ausgewertet, wenn das Control auch den Fokus hat, da bin ich mir jedoch nicht ganz sicher.* Wenn das so wirklich so ist, kannst du natürlich keine Standard-Controls nehmen, da SetFocus nur funktioniert, wenn das Top-Level-Fenster den Focus inne hat.
Komplizierter wird es natürlich noch mit den WM_NC-Nachrichten, dazu müsste wahscheinlich noch WM_NCHITTEST gesendet und ausgewertet werden, in dieser Richtung habe ich jedoch auch nichts probiert.
Insgesamt passt dein Nick zum Thema
*Funktioniert doch, aber einige Controls wie eine Combobox, setzen den Focus auf ihre Listbox, die Vollbildanwendung würde minimiert werden. Daher(Edit: Trotzdem) fallen alle Controls dieser Kategorie natürlich flach.
Edit2: Die Listbox wird nur im Vordergrund angezeigt, der Fokus wird nicht neu gesetzt.