У меня есть интересный случай, чтобы решить:
У меня есть нативное (winapi) приложение, которое использует MDI. Это приложение позволяет мне расширять себя простым языком сценариев. Сценарии запускаются в другом потоке, чем поток пользовательского интерфейса (хотя я могу получить идентификатор потока пользовательского интерфейса с соответствующими функциями). Язык сценариев также позволяет мне запускать любой код на C ++ (через LoadLibrary).
Чего я хотел бы добиться, так это создать внутри этого приложения новое окно, в котором можно было бы разместить WPF и «прикрепить его» как дочернее окно MDI к клиенту MDI (область mdi). Кроме того, я хотел бы, чтобы это окно правильно «общалось» с областью MDI, например, обновляло список окон в меню mdi.
До сих пор мое первое предположение состояло в том, чтобы просто создать окно WinForms, разместить внутри него WPF, а затем попытаться сделать его дочерним окном mdi, указав в качестве родительского MDI-клиента (поскольку мое хост-приложение написано не на c #, есть ручка, поэтому я сделал это с User32.SetParent()
P / Invoke). Это работало почти хорошо, после того, как я прикрепил свой поток скрипта к потоку GUI, но у меня было немного проблем с ним: меню MDI с активными окнами не обновлялось, окно не взаимодействовало правильно (оно останавливалось, когда не должно было быть, и т. Д. .).
Затем я попытался установить флаги (style, exStyles) с помощью SetWindowLongPtr
. Это немного изменило поведение моего окна, но это было не так.
Теперь я рассматриваю возможность использования функции CreateMDIWindow
или SendMessage
, в соответствии с документацией отправка сообщения должна создать окно, даже если я отправляю его из другого потока. Проблема в том, что этот способ дал бы мне только собственный дескриптор, и я не мог найти (пока) никакого способа размещения в нем WinForms / WPF.
Мне любопытно, пытался ли кто-нибудь сделать нечто подобное и имел ли он какие-либо результаты? Какой путь будет наилучшим - попытаться создать окно WinForms и добавить его в клиент MDI, или создать собственное окно и попытаться разместить в нем WinForms (какой-либо конкретный способ сделать это)?
Большинство ответов на этот вопрос, которые я нашел, имеют дело с ситуацией, когда хостингом приложения управляют, поэтому вы можете просто установить свойство .MDIParent
, которое в этом случае, боюсь, не будет работать.