Einem Fenster vorgeben, aktiv zu sein
-
Wie schaffe ich es, einem HWND einer anderen Applikation vorzutäuschen, es wäre aktiv und im Vordergrund?
Meine Überlegungen sehen so aus, dass ich die WndProc Funktion des Handles mit meiner eigenen ersetzen würde, und so Minimierungs Messages oder alles, was darauf schließen lässt, das Fenster muss sich nicht mehr zeichnen, filtern würde (Welche wären das alles?).
Bzw. der umgekehrte Weg: Ich sende dem HWND alle erforderlichen Messages, die ihm weißmachen, es wäre soeben in den Vordergrund geschoben worden.
Danach könnte ich die BeginPaint Funktion hooken, damit das Fenster in mein DC rendert.
Was sagt ihr - Könnte ich das so implementieren? Was muss ich dabei beachten?
Weitere Informationen zu meinem Vorhaben:
Die NativeWindow - Klasse von Adobe Flash einer Webseite möchte ich in einer Awesomium (basiert auf WebKit / Chrome) offscreen rendern
In dem WebView von Awesomium bleibt das Fenster allerdings schwarz. (Da es weiß, dass es offscreen ist)
-
Das hört sich alles noch etwas konfus für mich an.
Ich bin mir mittelmäßig sicher, dass das Fenster nicht weiß / sich nicht dafür interessiert, dass es Offscreen ist. Stattdessen sendet Windows eine WM_PAINT-Nachricht wenn das Fenster angezeigt werden muss, was nie der Fall ist.
Eigentlich ist für diesen Fall die WM_PRINT-Nachricht gedacht, aber die wird meist nicht implementiert (ist aber einen Versuch wert, vielleicht hast du ja Glück).
Wenn das nicht funktioniert würde ich es mit WM_PAINT oder WM_NCPAINT versuchen und dann den Inhalt des DC kopieren.
Dann würde ich mir überlegen, ob es nötig ist eine Kopie zu machen. Warum nicht einfach SetParent benutzen und damit das fremde Fenster zu deinem Kind-Fenster machen und entsprechend verschieben, eventuell noch den Rahmen weg machen und ganz normal anzeigen?
Das mit dem Vortäuschen und hooken von Nachrichten würde ich versuchen zu vermeiden.
-
Hi nwp3, danke für deine Antwort.
Gerade weil es sich dafür interessiert, ob es hidden/minimiert ist, suche ich nach einer Hilfestellung.
Dein Vorschlag mit SetParent ist nicht zweckmäßig, da das Bild in einen offscreen gerendert werden soll und nicht auf den Desktop.
WM_Print wird nicht implementiert und WM_Paint würde ich ja dann sowieso benutzen, da ich ja, wie schon geschrieben, die BeginPaint Funktion hooke, damit WM_PAINT auch in mein DC rendert.
Ich wollte nur erstmal wissen, ob meine Methode grundsätzlich funktionieren kann.
Außerdem weiß ich nicht, ob das Programm noch auf anderem Wege herausfinden kann, ob es hidden/minimiert ist oder ob das wirklich nur durch die WM_* messages realisiert wird?
-
Du solltest auf darauf achten, dass die Größe und Typen der DC's übereinstimmen. Der offensichtliche Weg herauszufinden, ob ein Fenster sichtbar ist, ist isWindowVisible, aber sowas benutzt man nicht innerhalb von WM_PAINT, da innerhalb von WM_PAINT isWindowVisible immer TRUE ist.
Ansonsten sehe ich kein prinzipielles Problem.
-
Naja.. so einfach ist es dann doch nicht..
Dem Flash Fenster (das Fenster, das offscreen gerendert werden soll) werden ständig WM-USER+1 (bzw. uiMsg=0x0401) Messages gesendet, mit denen ich nichts anfangen kann.
Doch sind diese scheinbar fürs Zeichnen verantwortlich, da sich der Flash Client Bereich nicht zeichnet, wenn ich diese Messages blocke.
Hat noch jemand eine Idee zur Problemlösung?