Различные проблемы с использованием SetParent для встраивания окна во внешний процесс

Возможный дубликат:
Встраивание HWND во внешний процесс с использованием SetParent

Я пытаюсь встроить окно из моего процесса в окно внешнего процесса, используя SetParent функции и столкнулись с несколькими проблемами, которые, я надеюсь, кто-то может помочь мне. Прежде всего, вот схема того, что я сейчас делаю, чтобы встроить свое окно в приложение:

WND 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);

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

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

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

Благодарю.

1 ответ

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

Вам нужно использовать AttachThreadInput присоединить поток вашего процесса к входной очереди хост-процесса. В дополнение к синхронизации обработки сообщений во всех подключенных потоках это заставляет их совместно использовать фокус, асинхронное состояние ключа, активацию и другие свойства, связанные с вводом.

Команды сочетания клавиш основного приложения не работают, когда мое окно находится в фокусе.

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

Создание пользовательского интерфейса, охватывающего несколько потоков в разных процессах, является сложным процессом, и здесь есть много подводных камней.

Другие вопросы по тегам