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

时间:2017-06-23 15:44:17

标签: c# winforms touch windows-messages imessagefilter

我希望尽可能直接访问触摸输入,以避免可能与正常事件隧道和冒泡相关的任何延迟,所以我想我会尝试使用消息而不是事件。使用以下代码,我可以拦截发送到$width的任何消息:

WindowsFormsHost

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

首先,我怎么知道每条消息应该是什么意思?有没有我可以查看这些消息号码的地方?

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

我一直在努力查找有关此问题的信息,但我找不到能解决问题的任何内容。似乎有一个系统消息表here但是我没有看到它提到触摸,它仍然没有解释在C#中传递给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; } } 的类型。

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

2 个答案:

答案 0 :(得分:2)

  

首先,我怎么知道每条消息应该是什么意思?   有没有我可以查看这些消息号码的地方?

以下是TOUCH消息的MSDN Reference

在这里,您可以找到解释触摸输入时使用的numerical declarations for TOUCH messages as well as the auxiliary data structures

  

另外,我猜我应该使用Message.GetLParam()来获取所需的内容   有关触摸的信息:x,y和ID。但我怎么知道呢   要传递给该方法的类型?

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

答案 1 :(得分:0)

因此,该解决方案涉及大量链接(例如https://msdn.microsoft.com/en-us/library/windows/desktop/ms632654(v=vs.85).aspx),然后查找C ++头文件以了解如何从消息的wParam和lParam属性中实际提取数据,然后翻译C ++进入C#。为了解释我收到的WM_POINTER消息,我最终编写了这样的代码:

    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值。