Интеграция HwndSource win32 с лентами и подсказками - PullRequest
0 голосов
/ 09 февраля 2011

Моя ситуация довольно сложная, но я видел, как другие люди делали это. К сожалению, нет упоминания о моей конкретной проблеме. Я пытаюсь интегрировать пользовательский элемент управления 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 года.

1 Ответ

0 голосов
/ 09 февраля 2011

Вы должны иметь возможность передавать необработанные ключевые события из формы Windows в слой WPF.Переопределите OnKeyDown, OnKeyUp и любые другие, которые вам могут понадобиться.Если ни один из ваших элементов управления Form1 не обработает событие, свойство Handled объекта KeyEventArgs будет иметь значение false.

Затем вы можете преобразовать Forms.KeyEventArgs в Controls.KeyEventArgs и передать его в слой WPF.Удостоверьтесь, что вы не скопировали логическое значение Handled, иначе ваша WPF-часть не будет обрабатывать его вообще.:)

Я приложил пример кода, который иллюстрирует идею.

public partial class Form1 : System.Windows.Forms.Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
    {
        base.OnKeyDown(e);
        if (!e.Handled)
        {
            mUserCtrl.OnKeyDown(/* convert e into a Controls.KeyEventArgs and pass it */);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...