【转载】通过 GetMessageExtraInfo 方法判断当前收到的鼠标消息是否来自触控板和 Pen

大家都知道,在不开启 WM_Pointer 的情况下,无论是走 WM_Touch 或者是 RealTimeStylus 等方式,默认下触摸都会提升为鼠标消息从而更好兼容应用程序的逻辑

如果此时应用程序想要根据消息循环里面接收到的 Win32 消息判断一个鼠标消息的来源是否来自于触摸框触摸屏或者是 Pen 笔等,可以通过 GetMessageExtraInfo 方法获取更多的信息

根据 GetMessageExtraInfo 方法获取到的 LPARAM 进行 Mask 一下 0xFFFFFF80 值,即可通过返回的结果判断鼠标消息的来源,如返回的结果是 0xFF515780 则判断是 Touch 触摸消息过来的,通过返回结果是 0xFF515700 则判断是 Pen 笔过来的

演示的代码如下

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
	const int WM_LBUTTONDOWN = 0x0201;
	if (msg == WM_LBUTTONDOWN)
	{
		var messageExtraInfo = PInvoke.GetMessageExtraInfo();
		var value = messageExtraInfo.Value.ToInt64();
		var mask = 0xFFFFFF80; // MOUSEEVENTF_FROMTOUCH
		var result = value & mask;

		if (result == 0xFF515780)
		{
			// 这是 Touch 过来
		}
		else if (result == 0xFF515700)
		{
			// 收到 Pen 的
		}
		else if (value == 0)
		{
			// 这是鼠标
		}
	}

	return IntPtr.Zero;
}

通过以上代码即可了解当前收到的鼠标消息是否从触摸或笔消息提升的,还是由真正的鼠标创建

特别感谢 許煜坤-台灣微軟研究開發處 的大佬提供了这个方法。


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。

你可能感兴趣的:(windows,microsoft)