WPF 等效于 Application.AddMessageFilter(Windows 窗体)

Posted

技术标签:

【中文标题】WPF 等效于 Application.AddMessageFilter(Windows 窗体)【英文标题】:WPF equivalent of Application.AddMessageFilter (Windows Forms) 【发布时间】:2010-10-03 12:06:39 【问题描述】:

我在我的WinForms 应用程序中使用了Application.AddMessageFilter()(使用非托管代码时)。

现在我切换到WPF,但找不到此功能。

请告知在哪里可以找到或实施它。

【问题讨论】:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/97cc207c-49a7-4a49-9fc1-fdf3b5d904d2/ 看起来像一个解决方案/编辑:类似的问题在这里:http://***.com/questions/476084/c-twain-interaction 【参考方案1】:

在 WPF 中,您可以使用ComponentDispatcher.ThreadFilterMessage 事件。

ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
private void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)

     if (msg.message == 513)//MOUSE_LEFTBUTTON_DOWN
     
         //todo
     

【讨论】:

【参考方案2】:

如果你想监听一个窗口消息,你可以使用 HwndSource.AddHook 方法。下面的例子展示了如何使用 Hwnd.AddHook 方法。如果要监控应用范围的消息,可以尝试使用 ComponentDispatcher 类。

private void Button_Click(object sender, RoutedEventArgs e)

    Window wnd = new Window();
    wnd.Loaded += delegate
    
        HwndSource source = (HwndSource)PresentationSource.FromDependencyObject(wnd);
        source.AddHook(WindowProc);
    ;
    wnd.Show();

private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)


【讨论】:

以上是关于WPF 等效于 Application.AddMessageFilter(Windows 窗体)的主要内容,如果未能解决你的问题,请参考以下文章

WPF等效于Application.AddMessageFilter(Windows窗体)

WinForms 等效于 WPF WindowInteropHelper、HwndSource、HwndSourceHook

等效于 Avalonia 的应用程序设置

Datagrid 等效于 HTML 表单占位符属性 [重复]

是否有与 UWP 的 SplitView Hamburger Menu 等效的 WPF?

如何最好地利用新的类型等效功能在 WPF 应用程序中托管 MapPoint 控件