WPF如何将所有事件从一个窗口重定向到另一个窗口

时间:2021-06-27 03:39:53

标签: c# wpf winapi wndproc

在我的 WPF 项目中,我有两个窗口。我需要将所有事件从 Window1 重定向到 Window2。

查看此屏幕截图

Sample

我想做什么?


以截图为例,当我将鼠标移到 window1 按钮上时,它应该突出显示窗口 2 中的按钮。

在实际情况下,窗口 2 将包含一些其他内容,这不仅仅是我试图实现的鼠标移动事件,我还试图实现所有事件,包括输入处理。这意味着 window1 必须将其所有事件转发到 window2。

到目前为止我尝试了什么?


由于所有事件通常通过 WndProc 传递,因此我创建了一个到 Window1 的 WPF WndProc 的挂钩,并使用 SendMessage() 将其所有事件转发到 Window2。

这是我使用的代码:

public partial class MainWindow : Window
{
    Window window1;
    IntPtr winHwnd;

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

    public MainWindow()
    {
        InitializeComponent();
        window1 = new Window1();
        window1.Show();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        var hwnd = new WindowInteropHelper(this).EnsureHandle();
        winHwnd = new WindowInteropHelper(window1).EnsureHandle();
        HwndSource hwndSource = HwndSource.FromHwnd(hwnd);
        hwndSource.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if(winHwnd!=IntPtr.Zero)
        {
            SendMessage(winHwnd, msg, wParam, lParam);
        }
        return IntPtr.Zero;
    }
}

这只是我用于测试的代码,当我检查时,我能够将 win32 事件从 Window1 传输到 Window2,但没有一个 WPF 事件在工作。但 win32 事件运行良好。

经过一些研究,我发现 WPF 使用 ComponentDispatcher 来注册 WPF 事件,但我如何才能通过它共享事件。

0 个答案:

没有答案
相关问题