首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定如何在Windows控件中使用IMessageFilter处理消息?

如何确定如何在Windows控件中使用IMessageFilter处理消息?
EN

Stack Overflow用户
提问于 2017-06-23 15:44:16
回答 2查看 1.6K关注 0票数 1

我希望尽可能直接地访问触摸输入,以避免与正常事件隧道和冒泡相关的任何滞后,因此我想尝试使用消息而不是事件。使用下面的代码,我可以拦截发送到我的WindowsFormsHost的任何消息

代码语言:javascript
复制
class FlashFormHost : WindowsFormsHost, IMessageFilter
{
    public FlashFormHost()
    {
        Application.AddMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m)
    {

        switch (m.Msg)
        {
            // These four messages should be ignored because they're on every frame.
            case 49783:
            case 275:
            case 512:
            case 581:
                break;
            default:
                MainWindow.Print(m.Msg + ": " + m.LParam + ", " + m.WParam);
                break;
        }
        return false;
    }
}

每次触摸控件时,我都会收到三条消息: 585、582和49413。每次我停止触摸控件时,我都会收到两条信息: 583和586。

首先,我怎么知道每一条信息都意味着什么?有什么地方可以查到这些留言号码吗?

另外,我猜我应该使用Message.GetLParam()来获取所需的关于触摸的信息: x、y和ID,但是我如何知道传递给该方法的类型呢?

我一直试图查找有关这方面的信息,但我没有找到任何解决我的问题的方法。似乎有一个系统消息表这里,但我没有看到它提到触摸,它仍然无法解释在C#中传递给GetLParam()的类型。

编辑:我忘记提到我在使用Windows 10,我没有意识到Windows版本之间的消息会发生变化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-19 14:52:47

因此,解决方案包括以下许多链接(例如https://msdn.microsoft.com/en-us/library/windows/desktop/ms632654(v=vs.85).aspx,然后查找C++头文件,以了解如何从消息的wParam和lParam属性中实际提取数据,然后将C++转换为C# )。为了解释我收到的WM_POINTER消息,我编写了如下代码:

代码语言:javascript
复制
    public static ushort LOWORD(ulong l) { return (ushort)(l & 0xFFFF); }
    public static ushort HIWORD(ulong l) { return (ushort)((l >> 16) & 0xFFFF); }
    public static ushort GET_POINTERID_WPARAM(ulong wParam) { return LOWORD(wParam); }
    public static ushort GET_X_LPARAM(ulong lp) { return LOWORD(lp); }
    public static ushort GET_Y_LPARAM(ulong lp) { return HIWORD(lp); }

这给了我所需的所有信息,即触摸ID以及x和y值。

票数 0
EN

Stack Overflow用户

发布于 2017-06-23 16:48:40

首先,我怎么知道每一条信息都意味着什么?有什么地方可以查到这些留言号码吗?

这是用于触摸消息的MSDN参考

在这里,您可以找到在解释触摸输入时使用的触摸消息的数值声明以及辅助数据结构

另外,我猜我应该使用Message.GetLParam()来获取所需的关于触摸的信息: x、y和ID,但是我如何知道传递给该方法的类型呢?

从我给出的引用中,查找正在传递给消息的参数类型。如果它是指向结构的指针,则可以找到该结构在PInvoke.net的Interop声明。将所需的结构声明复制到代码中,并在调用Message.GetLParam()时使用它们的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44725377

复制
相关文章

相似问题

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