首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF拦截全局鼠标移动(如在Windows窗体中使用IMessageFilter )

WPF拦截全局鼠标移动(如在Windows窗体中使用IMessageFilter )
EN

Stack Overflow用户
提问于 2016-05-27 13:44:19
回答 1查看 1.6K关注 0票数 1

我正在将UserControlWindows窗体转换为WPF,下面是我的Windows表单工作代码:

代码语言:javascript
复制
GlobalMouseHandler mouseHandler = new GlobalMouseHandler();
mouseHandler.MouseMove += OnGlobalMouseMove;
mouseHandler.MouseButtonUp += OnGlobalMouseButtonUp;

public class GlobalMouseHandler : IMessageFilter, IDisposable
{
    public event MouseMovedEvent MouseMove;
    public event MouseButtonUpEvent MouseButtonUp;

    public GlobalMouseHandler(){
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_MOUSEMOVE:
                MouseMove?.Invoke();
                break;
            case WM_LBUTTONUP:
                MouseButtonUp?.Invoke();
                break;
        }
        return false;
    }
}

我使用IMessageFilter在我的应用程序中获取鼠标移动和鼠标事件并附加到它们上。

现在,我知道了IMessageFilter is not available in WPF,但是有什么简单的方法可以在WPF中记录这些简单的鼠标事件吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-27 13:55:28

您可以以类似的方式处理消息(例如鼠标移动):

Xaml:

代码语言:javascript
复制
<Window ... Loaded="Window_OnLoaded">
    ...
</Window>

代码隐藏:

代码语言:javascript
复制
    using System.Windows.Interop;

    ...

    private const int WM_MOUSEMOVE = 0x0200;

    private void Window_OnLoaded(object sender, RoutedEventArgs e)
    {
        HwndSource.FromHwnd(new WindowInteropHelper(this).Handle)?.AddHook(this.WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        switch (msg)
        {
            case WM_MOUSEMOVE:
                // MouseMove?.Invoke();
                break;
        }

        return IntPtr.Zero;
    }

当然,如果您不想以本机WPF的方式执行此操作(例如,左键向上):

代码语言:javascript
复制
<Window ... PreviewMouseLeftButtonUp="Window_OnPreviewMouseLeftButtonUp">
    ...
</Window>

private void Window_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    // e.Handled = true if you want to prevent following MouseLeftButtonUp event processing
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37485091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档