Okno rodzica zawiesza się, gdy okno dziecka zawiesza się, mimo że pochodzi z innego procesu
Zrzeczenie się: Nie znam API Win32, zwłaszcza jak działają okna.
Chciałbym, aby okno niektórych przetwarzało okno potomne innego procesu. Te dwa procesy są także rodzicem i dzieckiem. Ale to nie ma znaczenia. Jak dotąd wszystko działa jak urok - dopóki nie zamrożę głównego wątku okna potomnego.
Wyobraź sobie kontener.exe, który „hostuje” notepad.exe i someApplication.exe
Kiedy zawiesię główny wąteksomeApplication.exe przez kilka sekund jego okno jest zamrożone na ten czas. To jest całkowicie zrozumiałe. Ale oknocontainer.exe będzierównież powiesić na ten sam czas. Okna potomne innych hostowanych procesów (npnotepad.exe) będzie nadal działać dobrze.
UżywamSetParent
polecenie, aby zwykłe okno inne niż podrzędne było dzieckiem mojego kontenera.exe:
SetParent(
childProcess.HWND,
myOwnHWND
);
Po tym używamsetWindowPos
:
SetWindowPos(
childProcess.HWND,
HWND_TOP,
someXPos,
someYPos,
0,
0,
SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW
)
JakoArtykuł MSDN o SetParent sugeruje, ja też usuwamWS_POPUP
atrybut stylu i dodajWS_CHILD
atrybut. Ponieważ to też nie pomogło, dodałem teżWS_EX_NOACTIVATE
rozszerzony atrybut stylu, oba za pomocąSetWindowLongPtr
dowództwo. W końcu spróbowałem wysłać oba oknaWM_UPDATEUISTATE
a następnie aWM_CHANGEUISTATE
wiadomość, ale to też nic nie zmieniło.
To, co mnie myli, to to, że okno procesu nadrzędnego jest nadal rysowane normalnie, dopóki go nie dotknę. Potem zamarza całkowicie, dopóki okno dziecka nie zamarznie. Podejrzewam, że coś nazywa się„kolejka wejściowa”. TheArtykuł MSDN na tematWM_ACTIVATE
stan wiadomości:
Wysłane do aktywowanego okna i dezaktywacji okna. Jeśli oknaużyj tej samej kolejki wejściowej, wiadomość zostanie wysłanasynchronicznie, najpierw po dezaktywacji okna okna najwyższego poziomu, a następnie do procedury okna aktywowanego okna najwyższego poziomu. Jeśli okna korzystają z różnych kolejek wejściowych, wiadomość jest wysyłana asynchronicznie, więc okno jest aktywowane natychmiast.
Z tego powodu wiązałem duże nadzieje zWS_EX_NOACTIVATE
rozszerzony atrybut stylu.
Podsumowując: Czy jest możliwe hostowanie okna innego procesu i nie zamrażanie własnego okna, gdy okno potomne zawiesza się?