Родительское окно зависает, когда дочернее окно зависает, хотя это из другого процесса
отказЯ не знаком с Win32 API, особенно с тем, как работают окна.
Я хотел бы сделать окно какого-либо процесса дочерним окном другого процесса. Эти два процесса также являются родительскими и дочерними. Но я не думаю, что это имеет значение. Пока что все работает как брелок - пока я не заморозил основной поток дочернего окна.
Представьте себе контейнер.exe, который содержит «hosts» notepad.exe и someApplication.exe
Когда я приостановить основной потокsomeApplication.exe на несколько секунд его окно замораживается на это время. Это совершенно понятно. Но окноcontainer.exe будемтакже повесить в то же время. Дочерние окна других размещенных процессов (например,notepad.exe) продолжит нормально работать.
Я используюSetParent
Команда сделать обычное не дочернее окно дочерним для моего контейнера.exe:
SetParent(
childProcess.HWND,
myOwnHWND
);
После этого я используюsetWindowPos
:
SetWindowPos(
childProcess.HWND,
HWND_TOP,
someXPos,
someYPos,
0,
0,
SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW
)
КакСтатья MSDN о SetParent предполагает, я также очищаюWS_POPUP
атрибут стиля и добавитьWS_CHILD
приписывать. Так как это тоже не помогло, я также добавилWS_EX_NOACTIVATE
атрибут расширенного стиля, оба с помощьюSetWindowLongPtr
команда. Наконец, я попытался отправить оба окнаWM_UPDATEUISTATE
а затемWM_CHANGEUISTATE
сообщение, но это также ничего не изменило.
Меня смущает то, что окно родительского процесса продолжает рисоваться нормально, пока я не коснусь его. Затем он полностью замерзает, пока не замерзнет дочернее окно. Я подозреваю, что-то называется«входная очередь»,Статья MSDN ОбWM_ACTIVATE
сообщение гласит:
Отправляется как активируемому окну, так и деактивируемому окну. Если окнаиспользовать ту же очередь вводасообщение отправленосинхронносначала к процедуре окна активируемого окна верхнего уровня, затем к процедуре окна активируемого окна верхнего уровня. Если окна используют разные входные очереди, сообщение отправляется асинхронно, поэтому окно активируется немедленно.
Из-за этого я возлагал большие надежды наWS_EX_NOACTIVATE
расширенный атрибут стиля.
Подводя итог: можно ли на самом деле разместить окно другого процесса и не заморозить свое собственное окно при замораживании дочернего окна?