本文将告诉大家如何在 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. linux查看域名对应的解析ip

    方法1-直接使用ping 方法2-nslookup 方法3-dig

  2. BABYRE 【攻防世界】 Reverse

    题目 丢进Exeinfo PE里面,得到64bit,无壳 丢进IDA pro(x64)里面,找到主函数 代码中有一个花指令:*(unsigned int (__fastcall **)(char *) ...

  3. wordpress搭建个人博客(阿里云服务器、宝塔面板、Elementor)

    wordpress搭建个人博客(阿里云服务器.宝塔面板.Elementor) 笔记根据bilibili比得汪视频教程整理 https://www.bilibili.com/video/BV1Vg411 ...

  4. Sealos 开源初创公司 Trending 全球 TOP50,中国第二!

    今年,Runa Capital (鲁纳资本) 评选出了 2023 年增长最快的 50 家开源创业公司,Sealos 压轴登场,总共有两家中国公司上榜,Sealos 排名第二. Runa Capital ...

  5. 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中,我们使用 find() 和 find_one() 方法来在集合中查找数据,就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB ...

  6. C++ 多线程编程和同步机制:详解和实例演示

    C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能.本文将介绍多线程编程和同步机制的基本概念和使用方法. 多线程编程基础 在C++中,使用<thread&g ...

  7. 8. Linear Transformations

    8.1 Linear Requires Keys: A linear transformation T takes vectors v to vectors T(v). Linearity requi ...

  8. 【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kitx

    1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset,但不知道syscap.json文件应该配置在哪里,文档也没找到. 解决方案 新增关键资产等API ...

  9. ArkUI开发趣味体验,快来抽取限量HarmonyOS专属头像!

    本次ArkUI开发趣味体验活动,将手把手教大家如何在IDE里实操一个ArkUI程序,通过补充缺失代码,成功运行程序开启抽奖功能,抽取个人专属头像,做HarmonyOS第一批数字藏品家! 同时本期提供的 ...

  10. 报表输入页码翻页(润乾 V2018)

    报表数据分了太多页,一页一页翻页查看数据嫌麻烦,可以试试这种翻页效果--输入页码翻页. 润乾报表提供了翻页相关的 JS 函数,可以在报表展现的页面中添加 JS 调用翻页函数实现输入页码跳转到对应页. ...