我希望尽可能直接访问触摸输入,以避免可能与正常事件隧道和冒泡相关的任何延迟,所以我想我会尝试使用消息而不是事件。使用以下代码,我可以拦截发送到$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;
}
}
的类型。
答案 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值。