Родительское окно зависает, когда дочернее окно зависает, хотя это из другого процесса

отказЯ не знаком с 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 расширенный атрибут стиля.

Подводя итог: можно ли на самом деле разместить окно другого процесса и не заморозить свое собственное окно при замораживании дочернего окна?

Ответы на вопрос(1)

Ваш ответ на вопрос