Внедрение HWND во внешний процесс с использованием SetParent

Я пытаюсь встроить окно из моего процесса в окно внешнего процесса, используя функцию 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); 

Этот код работает, и мое окно появляется в другом приложении, но вводит следующие проблемы:

  • Когда мое окно получает фокус ввода, основное окно приложения внешнего процесса теряет фокус (т. Е. Строка заголовка меняет цвет)
  • Команды ярлыка клавиатуры основного приложения не работают, пока мое окно имеет фокус

Кто-нибудь знает об этом? Я хотел бы, чтобы мое окно рассматривалось как еще одно дочернее окно основного приложения.

Ну, наконец, я нашел ответ на мой вопрос.

Чтобы устранить проблему, когда основное приложение потеряло фокус, вам нужно использовать функцию AttachThreadInput, чтобы прикрепить встроенный stream windows к основному streamу приложения.

Кроме того, можно использовать функцию TranslateAccelerator в ответ на сообщения WM_KEYDOWN, чтобы обеспечить, чтобы сообщения ускорителя основного приложения запускались.

Я не уверен, что вы все еще интересуетесь этой темой через почти три года. Я работаю над аналогичным приложением. Мое решение – изменить стиль windows перед вызовом SetParent. С помощью этого решения мне не нужно называть AttachThreadInput.

Однако одна из основных проблем размещения дочерних окон от внешнего процесса заключается в том, что если внешний процесс зависает при ответе на ввод пользовательской клавиатуры или мыши, основное приложение также замерзает. Цикл сообщений в основном приложении все еще запущен. Однако он больше не принимает события ввода пользователя. Поэтому кажется, что он висит. Я считаю, что это прямой результат AttachThreadInput, поскольку входные события двух streamов теперь синхронизированы. Если один из них заблокирован, оба заблокированы.

Я нашел некоторую информацию об этом на Catch22.net, используя сообщение WM_NACTIVE.

Он находится в разделе Деактивация windows «Предотrotation». Надеюсь, это поможет.

Я столкнулся с той же проблемой, внимательно прочитав документ MSDN, я нашел это легким решением.

Вы должны удалить WS_POPUP и добавить WS_CHILD ПЕРЕД вызовом setParent

Это указано в MSDN:

По соображениям совместимости SetParent не изменяет стили windows WS_CHILD или WS_POPUP windows, родительский элемент которого изменяется. Поэтому, если hWndNewParent равно NULL, вы также должны очистить бит WS_CHILD и установить стиль WS_POPUP после вызова SetParent. И наоборот, если hWndNewParent не является NULL, а окно ранее было дочерним элементом рабочего стола, вы должны очистить стиль WS_POPUP и установить стиль WS_CHILD перед вызовом SetParent.

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

  • Что такое насос сообщений?
  • Создание libcurl с поддержкой SSL в Windows
  • Получить текущую позицию курсора
  • Добавление ведущих символов подчеркивания к символам сборки с помощью GCC на Win32?
  • CreateProcess из буфера памяти
  • Ограничивает ли Windows 7 доступ к папкам, как Vista?
  • Как хранить и извлекать учетные данные из диспетчера учетных данных Windows Vault?
  • Как служба Windows может выполнить приложение GUI?
  • Windows threading: _beginthread vs _beginthreadex vs CreateThread C ++
  • Сбой установки Windows 7 SDK
  • GetWindowRect возвращает размер, включая «невидимые» границы
  • Давайте будем гением компьютера.