ProcessCmdKey никогда не запускается в окне WinForms, запущенном из приложения WPF - PullRequest
2 голосов
/ 24 ноября 2010

У меня есть форма WinForms, которая раньше была отдельным приложением, но теперь запускается как часть более крупного приложения WPF. Это все еще отдельное окно, не содержащееся в окне WPF. Проблема, которую я вижу, заключается в том, что событие ProcessCmdKey в окне больше не запускается, поэтому у меня возникают проблемы при обработке специальных командных клавиш. Раньше это работало нормально, и код обработки ярлыков не изменился с ранее.

Кажется, корень проблемы в том, что форма больше не инициируется из метода WinForms Application.Run, и поэтому у нее больше нет собственного цикла сообщений. Есть ли способ исправить это, пока окна WPF и WinForms совместно используют поток пользовательского интерфейса, или мне придется настроить отдельный поток для окна WinForms, чтобы это работало? Я хотел бы избежать этого, если это возможно, так как тогда мне нужно установить межпотоковое взаимодействие для всего, что сейчас выполняется простыми вызовами методов.

1 Ответ

4 голосов
/ 24 ноября 2010

Ваше предположение верно, ProcessCmdKey() вызывается напрямую из цикла сообщений Winforms, запущенного Application.Run().Вы сейчас запускаете цикл сообщений WPF, он ничего не знает об обработке клавиатуры Winforms.Вкладка также должна быть неработоспособна.

Нет четкого решения этой проблемы, объектные модели слишком разные.System.Windows.Forms.Integration обеспечивает взаимодействие между ними, но работает на уровне управления, а не на уровне окна.Form.ShowDialog() - это возможный обходной путь.

И да, вы можете запустить новый поток STA (используйте Thread.SetApartmentState) и вызвать Application.Run(), чтобы запустить цикл сообщений Winforms.Однако неприятная проблема заключается в том, что эти формы не имеют отношения Z-порядка с окнами WPF.Они легко исчезнут за окном другого приложения.Исправление, которое требует пинкокинг SetParent(), свойство Owner вызовет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...