HwndSource win32与Ribbon和KeyTips集成

时间:2011-02-09 07:13:12

标签: c# wpf winapi ribbon

我的情况相当复杂,但我见过其他人这样做。不幸的是,没有提到我的具体问题。 我正在尝试将包含功能区的WPF UserControl集成到Win32主机应用程序中。到目前为止,一切都工作得非常好(令我惊讶的是,甚至)。我正在使用HwndSource创建一个原始的Win32子窗口并将其嵌入到Win32主机顶级窗口中。我已经尝试过TabControls,Buttons,RadioButtons,WebBrowsers以及UserControl中的所有内容,它们都可以从我的Win32主机应用程序中使用。当然,在UserControl的Grid的顶行有一个Ribbon控件。

这基本上就是我在做什么:

mHwnd = new HwndSource (
    0, 0x40000000 | 0x10000000, 
    0, 
    left, 
    top, 
    width, 
    height, 
    "CIntegrationTest", 
    parentHandle);
mUserCtrl = new UserControl1 ();
mHwnd.RootVisual = mUserCtrl;

这很有效。 我在功能区下方的UserControl1中有一些其他控件(如编辑和几个按钮)。当键盘焦点位于其中一个控件内时,我可以使用Alt +访问RibbonTabs的KeyTips及其元素。但是当焦点不在WPF UserControl内部,而是来自Win32主机的一些控件时,热键不起作用。

我看了一下热键的实现,发现一个名为KeyTipService的类(在RibbonControlsLibrary \ Microsoft \ Windows \ Controls \ KeyTipService.cs中找到)使用InputManager.Current.PostProcessInput和InputManager.Current.PreProcessInput来处理KeyTip热键。

不幸的是,我完全没有想法如何将必要的关键事件从Win32应用程序转发到功能区。我甚至不知道如何识别需要转发的消息。

也许这里的某个人遇到了类似的问题,或者对WPF消息处理有更多线索,可以帮助我或提供一些提示。

P.S。:我在Windows XP SP3上运行Visual Studio 2010 Premium,从2010年10月开始使用Microsoft Ribbons for WPF。

1 个答案:

答案 0 :(得分:0)

您应该能够将未处理的密钥事件从Windows窗体传递到WPF层。覆盖OnKeyDown,OnKeyUp以及您可能需要的任何其他内容。如果没有任何Form1控件处理事件,KeyEventArgs的Handled属性将为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 */);
        }
    }
}