我希望尽可能直接地访问触摸输入,以避免与正常事件隧道和冒泡相关的任何滞后,因此我想尝试使用消息而不是事件。使用下面的代码,我可以拦截发送到我的WindowsFormsHost的任何消息
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版本之间的消息会发生变化。
发布于 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消息,我编写了如下代码:
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值。
发布于 2017-06-23 16:48:40
首先,我怎么知道每一条信息都意味着什么?有什么地方可以查到这些留言号码吗?
这是用于触摸消息的MSDN参考。
在这里,您可以找到在解释触摸输入时使用的触摸消息的数值声明以及辅助数据结构。
另外,我猜我应该使用Message.GetLParam()来获取所需的关于触摸的信息: x、y和ID,但是我如何知道传递给该方法的类型呢?
从我给出的引用中,查找正在传递给消息的参数类型。如果它是指向结构的指针,则可以找到该结构在PInvoke.net的Interop声明。将所需的结构声明复制到代码中,并在调用Message.GetLParam()时使用它们的类型。
https://stackoverflow.com/questions/44725377
复制相似问题