Мы разрабатываем менеджер компоновки в WPF, у которого есть видовые экраны, которые пользователь может перемещать/изменять размер /etc. Видовые экраны обычно заполняются данными (изображениями/фильмами и т.д.) Через поставщиков, которые находятся под нашим контролем в менеджере компоновки. Моя задача - проверить, можно ли также разместить в окне просмотра любое внешнее приложение Windows (например, блокнот, calc, adobe reader и т.д.). Я столкнулся с рядом проблем.
Большинство ресурсов указывают на использование класса HwndHost. Я экспериментирую с этим пошаговым руководством самой Microsoft: http://msdn.microsoft.com/en-us/library/ms752055.aspx
Я адаптировал это, чтобы окно списка было заменено дескриптором окон из внешнего приложения. Может кто-нибудь помочь мне с этими вопросами:
- В пошаговом руководстве добавлено дополнительное статическое вспомогательное окно, в которое помещается
ListBox
. Я не думаю, что это нужно для внешних приложений. Если я опустить это, я должен сделать внешнее приложение дочерним окном (используя Get/SetWindowLong из user32.dll, чтобы установитьGWL_STYLE
какWS_CHILD
). Но если я это сделаю, панель меню приложения исчезнет (из-за стиляWS_CHILD
), и он больше не получает вход. - Если я использую вспомогательное окно и сделаю внешнее приложение дочерним, то это работает разумно, но иногда внешнее приложение не красиво выглядит.
- Кроме того, мне нужно, чтобы дочернее окно изменялось в область просмотра. Это возможно?
- Когда приложение exernal запускает дочернее окно (например, "Блокнот- > Справка- > О программе" ), это окно не размещается
HwndHost
(и, следовательно, может быть перемещено за пределы области просмотра). Есть ли способ предотвратить это? - Так как мне не нужно больше взаимодействовать между внешним приложением и менеджером макета, правильно ли я предполагаю, что мне не нужно ловить и пересылать сообщения? (пошаговое руководство добавляет HwndSourceHook в вспомогательное окно, чтобы уловить изменения выбора в списке).
- Когда вы запускаете (немодифицированный) пример VS2010 и закрываете окно, VS2010 не видит, что программа закончилась. Если вы сломаете все, вы попадете в сборку без источника. Что-то вонючее происходит, но я не могу его найти.
- Пошаговое руководство кажется очень неаккуратным, но я не нашел лучшей документации по этому вопросу. Любые другие примеры?
- Другой подход заключается не в использовании
HwndHost
, аWindowsFormHost
, как обсуждалось здесь. Он работает (и намного проще!), Но у меня нет контроля над размером приложения? Кроме того, WinFormHost на самом деле не предназначен для этого?
Спасибо за любые указатели в правильном направлении.