2008-10-04 4 views
18

Ich versuche, ein Fenster aus meinem Prozess in das Fenster eines externen Prozesses mit der SetParent Funktion einzubetten und habe ein paar Probleme, die ich hoffe, kann mir jemand helfen mit. Zunächst einmal, hier ist ein Überblick über, was ich derzeit tue mein Fenster in die Anwendung einbetten:Einbetten von HWND in externen Prozess mit SetParent

HWND myWindow; //Handle to my application window 
HWND externalWindow; //Handle to external application window 

SetParent(myWindow,externalWindow); 

//Remove WS_POPUP style and add WS_CHILD style 
DWORD style = GetWindowLong(myWindow,GWL_STYLE); 
style = style & ~(WS_POPUP); 
style = style | WS_CHILD; 
SetWindowLong(myWindow,GWL_STYLE,style); 

Dieser Code funktioniert und mein Fenster erscheint in der anderen Anwendung, sondern stellt die folgenden Probleme:

  • Tastaturkurzbefehle der Hauptanwendung nicht funktionieren, während mein Fenster den Fokus hat
  • Wenn mein Fenster gewinnt Eingabefokus, das Programmhauptfenster des externen Prozesses verliert Fokus (Farbe dh Titelleiste ändert)

    Kennt jemand einen Workaround dafür? Ich möchte, dass mein Fenster als ein anderes Kindfenster der Hauptanwendung behandelt wird.

  • Antwort

    12

    Nun, endlich habe ich die Antwort auf meine Frage gefunden.

    Um das Problem mit der Haupt-App zu beheben, die den Fokus verliert, müssen Sie die AttachThreadInput Funktion verwenden, um den eingebetteten Fenster-Thread an den Haupt-App-Thread anzuhängen.

    Außerdem kann man die TranslateAccelerator Funktion als Antwort auf WM_KEYDOWN Nachrichten verwenden, um sicherzustellen, dass Beschleunigermeldungen der Haupt-App ausgelöst werden.

    0

    Ich habe einige Informationen dazu unter Catch22.net mit der WM_NACTIVE Nachricht gefunden.

    Es ist im Abschnitt Fenster deaktivieren deaktivieren. Hoffe, dass hilft.

    4

    Ich bin mir nicht sicher, ob Sie nach fast drei Jahren immer noch an diesem Thema interessiert sind. Ich arbeite an einer ähnlichen Anwendung. Meine Lösung besteht darin, den Fensterstil vor dem Aufruf von SetParent zu ändern. Mit dieser Lösung muss ich AttachThreadInput nicht aufrufen.

    Ein Hauptproblem beim Hosten von untergeordneten Fenstern aus einem externen Prozess besteht jedoch darin, dass die Hauptanwendung auch einfriert, wenn der externe Prozess beim Antworten auf eine Tastatur- oder Mauseingabe hängen bleibt. Die Nachrichtenschleife in der Hauptanwendung läuft noch. Es empfängt jedoch keine Benutzereingabeereignisse mehr. Daher scheint es, als ob es hängt. Ich glaube, das ist das direkte Ergebnis von AttachThreadInput, da die Eingabeereignisse der beiden Threads nun synchronisiert sind. Wenn einer von ihnen blockiert ist, sind beide blockiert.

    0

    Ich stieß auf das gleiche Problem, nach dem Lesen von MSDN Doc sorgfältig, fand ich es eine einfache Lösung.

    Sie sollten WS_POPUP entfernen und hinzufügen WS_CHILD VOR Sie rufen setParent

    Es in MSDN angegeben ist:

    Aus Kompatibilitätsgründen ist SetParent nicht die WS_CHILD oder WS_POPUP Fensterstile des Fensters ändern, deren Stamm geändert werden. Wenn hWndNewParent NULL ist, sollten Sie daher das WS_CHILD-Bit löschen und den WS_POPUP-Stil nach dem Aufrufen von SetParent festlegen.Umgekehrt sollten Sie, wenn hWndNewParent nicht NULL ist und das Fenster zuvor ein Kind des Desktops war, den WS_POPUP-Stil löschen und den WS_CHILD-Stil festlegen, bevor Sie SetParent aufrufen.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx

    Verwandte Themen