Отказ от ответственности. Я не знаком с Win32 API, особенно с тем, как работают окна.
Я хотел бы сделать окно какого-либо процесса дочерним окном другого процесса. Эти два процесса также являются родительскими и дочерними. Но я не думаю, что это важно. Пока все работает как шарм - пока я не замораживаю основной поток дочернего окна.
Представьте себе контейнер .exe, что "hosts" notepad.exe и someApplication.exe
Когда я приостанавливаю основной поток someApplication.exe в течение нескольких секунд, его окно замерзает на такое количество времени. Это совершенно понятно. Но окно container.exe будет также зависать в одно и то же время. Детские окна других размещенных процессов (например, notepad.exe) будут продолжать работать нормально.
Я использую команду SetParent
, чтобы сделать обычное не-дочернее окно дочерним элементом моего container.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
.
Подводя итог: действительно ли возможно разместить окно другого процесса и не замораживать собственное окно, когда дочернее окно зависает?