在我的 WPF 项目中,我有两个窗口。我需要将所有事件从 Window1 重定向到 Window2。
查看此屏幕截图:
以截图为例,当我将鼠标移到 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 事件,但我如何才能通过它共享事件。