Windows Form как дочернее окно неуправляемого приложения

Я ищу способ встраивания приложений Windows Forms, написанных на C #, в приложение C ++ для Windows. Главное окно нативного приложения подразделяется на несколько панелей. Предполагается, что приложение C # появляется на одной из этих панелей, то есть корневое окно компонента C # (самая внешняя форма) должно быть дочерним окном основного приложения.

Можно ли это сделать? Если так, то как?

Некоторый дополнительный контекст: Насколько мне известно, есть два способа сделать это. Сначала разместите CLR в собственном приложении с помощью API-интерфейсов хостинга .net (ICLRRuntimeHost и т. Д.). Во-вторых, разместите CLR, поместив форму окна в элемент управления ActiveX.

Что касается первого подхода, мне удалось запустить CLR и загрузить сборку C # (во многом благодаря Маттиас Хогстрём). Я сталкиваюсь с препятствием на пути к тому, что я не вижу способа сказать компоненту, который я запускаю в CLR, что он должен быть потомком окна, переданного со стороны C ++.

Я также экспериментировал со вторым методом (используя ActiveX и благодаря Даниил Яновский). Это почти, но только почти, работает для моих целей. Я могу позволить произвольным компонентам Windows Forms запускаться на дочерней панели собственного приложения. НО они всегда запускаются в главном потоке основного приложения. Это означает, что они используют цикл сообщений Windows основного приложения. MSDN говорит, что это не будет работать надежно, поскольку стандартные циклы сообщений Windows не соответствуют требованиям Windows Forms (я хотел опубликовать ссылку на MSDN здесь, но уже использовал мое выделение new-user-two-link-allotment).

Согласно сообщениям MSDN, Internet Explorer и MFC, исключениями являются проблемы цикла сообщений. Родное приложение, которое я использую в качестве хоста, определенно не является Internet Explorer. Кроме того, он использует Windows API в виде wxWidgets, поэтому MFC не является (или, по крайней мере, не приветствуется) вариантом.

Microsoft предлагает решения, позволяющие компонентам C # работать в своих собственных циклах сообщений в своих собственных потоках. Это, по крайней мере, насколько я могу судить, обязательно возвращает к первому подходу, упомянутому выше. Итак, я вернулся к вопросу о том, как заставить Windows Form работать в переданном родительском окне.

Опять же, меня интересует любой ввод, который проясняет проблему дочернего окна, независимо от подходов, которые я упомянул здесь. Но в свете контекста я мог бы свести общий вопрос к двум конкретным вопросам (и мне нужен ответ только на один из них):

  • Учитывая форму Windows, размещенную в элементе управления ActiveX, как я могу позволить форме запускаться в своем собственном цикле сообщений в своем собственном потоке?

или же

  • Учитывая, что форма Windows работает в среде CLR, размещенной в собственном приложении, как я могу сделать форму дочерним окном окна в собственном приложении?

6

Решение

Да, это может быть сделано. Мы сделали то же самое несколько лет назад. Это наш подход: элемент управления .NET также имеет собственный дескриптор окна, мы получаем эти дескрипторы через C ++ / CLI и передаем их в Win32, а затем добавляем эти дескрипторы как дочерние элементы собственных окон. Таким образом, элементы управления .NET запускаются в главном потоке основного приложения, проблемная часть — цикл обработки сообщений, как вы упомянули в своем вопросе. При необходимости нам нужно перенаправить сообщение между нацией и окнами .NET. Как я помню, мы исправили много ошибок, связанных с этим, и все же была какая-то загадочная проблема, которую мы не обнаружили.

Есть и другой способ: использовать WPF Interop. http://msdn.microsoft.com/en-us/library/ms742522.aspx . По словам MS, это должно исправить проблемы с сообщениями, но мы не пробовали такой подход. Вы можете просто использовать Win32 для размещения WPF, а затем использовать WPF для размещения Winform.

Итак, для ваших последних 2 вопросов:

  1. Ты не можешь Только один цикл сообщений.
  2. Используйте ручку. В этой статье рассказывается о дескрипторе Windows Forms: http://blogs.msdn.com/b/jfoscoding/archive/2004/11/24/269416.aspx
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]