本文将告诉大家如何在 WPF 或者其他 Win32 应用里面,在收到鼠标消息时,通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸消息提升而来

大家都知道,在不开启 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;
}

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

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

本文以上的可调试代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 3c2d3fc41f0bca74e1c15be5d732138e0b958497

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 3c2d3fc41f0bca74e1c15be5d732138e0b958497

获取代码之后,进入 WegairhokawhelnaHibairdercawwe 文件夹

更多请参阅 应用程序疑难解答 - Win32 apps - Microsoft Learn

更多触摸和笔迹书写相关请看 WPF 触摸相关

WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来的更多相关文章

  1. WPF绑定的ListBox获取ListBoxItem及GoToState应用

    现公司项目中需要制作一个扇形菜单,菜单项是用ListBox重写Style实现的,其数据是绑定的.菜单的每一项都有Normal,MouseOver和Selected三种状态,这三种状态当然可以通过鼠标移 ...

  2. python学习历程之split()方法获取cmd mysql 结果集

    if __name__=='__main__': FServerId = raw_input("Please input source id:") GetFileKey(FServ ...

  3. [Android Pro] 关于inputStream.available()方法获取文件的总大小

    reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调 ...

  4. 使用jquery中height()方法获取各种高度大全

    alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(docum ...

  5. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. Jquery中css()方法获取边框长度

    1. JQuery中可以使用css()方法获取块元素的边框宽度,如下: $("divMode").css("border-left-width");//左边框长 ...

  7. jquery通过ajax方法获取json数据不执行success

    1.jquery通过ajax方法获取json数据不执行success回调 问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准 ...

  8. extjs DateField 的值用getValue()方法获取后是一大堆字符串,类似Tue Dec 07 2010 00:00:00 GMT 0800,这玩意存入数据库实在不好办。。。

    extjs DateField 的值用getValue()方法获取后是一大堆字符串,类似Tue Dec 07 2010 00:00:00 GMT 0800,这玩意存入数据库实在不好办...所以要把它格 ...

  9. 关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配。”的解决办法

    关于jquery html()方法获取带有OBJECT标签的元素内容时,出现“类型不匹配.”的解决办法 解决办法: $("selector").clone().html()

  10. ObjectStore onFetch方法获取记录总数

    转自:http://blog.csdn.net/earthhour/article/details/38686029 ObjectStore onFetch方法获取记录总数 require(['doj ...

随机推荐

  1. Jest快速使用指南

    1. 引言 写了几个函数,怎么知道写得对不对呢? 可以通过测试函数,当然开发中测试的意义不只是这个 Jest是常用的JavaScript测试框架 官网为:Jest · Delightful JavaS ...

  2. 记录--h5端调用手机摄像头实现扫一扫功能

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.前言 最近有遇到一个需求,在h5浏览器中实现扫码功能,其本质便是打开手机摄像头定时拍照,特此做一个记录.主要技术栈采用的是vue2,使 ...

  3. react-naive工作原理

    react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中,virtual dom 就像一个中间层,介于开发者描述的视图与实际在页面上渲染的视图之间.为了在 ...

  4. 2024最新最全Java和Go面经,面试了30多场,终于上岸了!

    ​> 本文来自我们技术交流群群友的投稿,未经授权,禁止转载. 原文链接:太难了,Java和Go,面试了30多场,终于上岸了! 先听一下TA的故事 2023年10月份我就做好了离职跳槽的准备,做了 ...

  5. 进程管理与 SELinux

    进程管理与 SELinux   在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予 ...

  6. #树链剖分,树上启发式合并#CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    题目 分析 考虑回文串当且仅当最多有一个字母出现奇数次, 可以记录某个二进制状态的最大深度, 一种就是点\(x\)到某个点,另一种就是经过点\(x\)的一条路径 在\(x\)的子树中递归实现,重儿子保 ...

  7. GitHub/GitLab 为不同的项目修改提交名字 user.name 和邮箱 user.email(附:批量处理脚本)

    背景 大疫情的背景下,家里的电脑需要同时支撑自己和公司的项目,根据 GitHub/GitLab 网站的提交记录上看,其是根据邮箱来辨识用户的,所以有必要分别针对不同的项目设置不同的 Git 名字(us ...

  8. netty系列之:在netty中实现线程和CPU绑定

    目录 简介 引入affinity AffinityThreadFactory 在netty中使用AffinityThreadFactory 总结 简介 之前我们介绍了一个非常优秀的细粒度控制JAVA线 ...

  9. 体验Semantic Kernel图片内容识别

    前言 前几日在浏览devblogs.microsoft.com的时候,看到了一篇名为Image to Text with Semantic Kernel and HuggingFace的文章.这篇文章 ...

  10. DevEco Studio的这些预览能力你都知道吗?

    在万物互联的今天,开发者在应用/服务开发过程中,需要考虑应用/服务在不同设备上的运行效果.为满足这一需求,DevEco Studio 作为 HarmonyOS 和 OpenAtom OpenHarmo ...