Моя ситуация довольно сложная, но я видел, как другие люди делали это. К сожалению, нет упоминания о моей конкретной проблеме.
Я пытаюсь интегрировать пользовательский элемент управления WPF, включая ленту, в хост-приложение Win32. Пока что все работает довольно аккуратно (к моему удивлению, даже). Я использую HwndSource для создания необработанного дочернего окна Win32 и встраивания его в окно верхнего уровня хоста Win32. Я пробовал TabControls, Buttons, RadioButtons, WebBrowsers и все, что находится внутри UserControl, и все они могут быть использованы из моего хост-приложения Win32. И, конечно же, в верхней строке сетки UserControl есть элемент управления ленты.
Вот в основном то, что я делаю:
mHwnd = new HwndSource (
0, 0x40000000 | 0x10000000,
0,
left,
top,
width,
height,
"CIntegrationTest",
parentHandle);
mUserCtrl = new UserControl1 ();
mHwnd.RootVisual = mUserCtrl;
Это работает довольно хорошо.
У меня есть некоторые другие элементы управления (например, редактировать и несколько кнопок) в UserControl1 под лентой. Когда фокус клавиатуры находится внутри одного из этих элементов управления, я могу использовать Alt + для доступа к подсказкам клавиш RibbonTabs и их элементам. Но когда фокус находится не внутри WPF UserControl, а при некотором контроле со стороны хоста Win32, горячие клавиши не работают.
Я посмотрел на реализацию горячих клавиш и обнаружил, что класс KeyTipService (находится в RibbonControlsLibrary \ Microsoft \ Windows \ Controls \ KeyTipService.cs) использует InputManager.Current.PostProcessInput и InputManager.Current.PreProcessInput для обработки горячие клавиши KeyTip.
К сожалению, у меня совершенно нет идей, как я могу переслать необходимые ключевые события из приложения Win32 на ленту. Я даже не знаю, как я мог определить сообщения, которые нужно переадресовать.
Может быть, кто-то здесь столкнулся с подобной проблемой или имеет какие-то дополнительные сведения об обработке сообщений WPF и может помочь мне или дать некоторые подсказки.
P.S .: Я запускаю Visual Studio 2010 Premium на Windows XP с пакетом обновления 3 (SP3) и использую ленты Microsoft для WPF с октября 2010 года.