You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MFC对话框中托管的非模态WPF控件无法接收键盘输入

在MFC对话框中托管WPF控件时文本框无法接收键盘输入的问题

我们正在将旧版C++/CLI MFC应用现代化,用C#/WPF编写的新控件替换原有对话框。按照微软《Hosting WPF Content in Win32》指南在CDialog中托管WPF控件后,控件内的文本框无法接收键盘输入(包括退格、删除、空格等特殊键)。

我们尝试通过HwndSource实现消息循环处理键盘消息,但没有效果,代码如下:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
    source.AddHook(WndProc);
}

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    HwndSource source = HwndSource.FromHwnd(hwnd);
    if (source != null)
    {
        System.Windows.Interop.MSG message = new MSG
        {
            hwnd = hwnd,
            lParam = lParam,
            wParam = wParam,
            message = msg,
            pt_x = 0,
            pt_y = 0
        };

        switch (msg)
        {
            // WM_KEYDOWN
            case 0x0100:
                Debug.WriteLine("Received WM_KEYDOWN");
                var keyboardSink = (IKeyboardInputSink)source;
                keyboardSink.TranslateAccelerator(ref message, Keyboard.Modifiers);
            break;

            // WM_CHAR
            case 0x0102:
                Debug.WriteLine("Received WM_CHAR");
                var keyboardSink2 = (IKeyboardInputSink)source;
                keyboardSink2.TranslateChar(ref message, Keyboard.Modifiers);
            break;
        }
    }

    return IntPtr.Zero;
}

但将该WPF控件嵌入纯Win32窗口可正常工作,从主WPF控件弹出的模态对话框内文本框也能接收键盘输入,推测问题与主控件的非模态特性相关。

我们已准备好最小复现示例,示例应用截图如下:
示例应用截图

本人MFC知识基础薄弱,恳请各位提供帮助。

内容的提问来源于stack exchange,提问作者Michaelvsk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:40:09