【问题标题】:HwndSource win32 integration with Ribbons and KeyTipsHwndSource win32 与 Ribbons 和 KeyTips 集成
【发布时间】:2011-06-23 22:57:12
【问题描述】:

我的情况相当复杂,但我见过其他人这样做。不幸的是,没有提到我的具体问题。 我正在尝试将包含功能区的 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。

【问题讨论】:

    标签: c# wpf winapi ribbon


    【解决方案1】:

    您应该能够将未处理的键事件从 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 */);
            }
        }
    }
    

    【讨论】:

    • 我使用的不是 WinForms 互操作,而是 win32 互操作 (HwndSource) 类。问题是我无法将键盘消息正确转发到 InputManager,这是 Ribbons KeyTip 实现使用的。有 InputManager.ProcessInput(),但它没有按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2019-12-11
    • 2013-04-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多