在 wpf 中可以通过 stylusplugin 的方式快速从触摸线程拿到触摸数据,而 winforms 没有这个机制,但是可以通过 microsoft.ink 组件和 wpf 相同在 realtimestylus 服务拿到触摸点

本文的例子放在微软的官方例子里面,请看 github 代码

本文不会告诉大家代码如何写,因为看微软的代码就知道了,本文主要告诉大家为什么这样做的触摸收集足够快

在 windows 里面,会通过 wm_touch 的消息发送触摸的信息,但是通过消息的方式不够快。当然这句话不是说消息不快,而是和 wisptis 服务对比还是不够快

从微软的笔和触摸服务里面获取的方法是需要使用复杂的方法才能获取到内容,大概的获取方法就是从共享内存里面读取值,此时的读取速度将比消息快

在 csproj 里面引用 microsoft.ink 组件,将可以获取 realtimestylus 的封装方法,不需要写一个 penimc 的组件。但是通过这个方法将拿到十分底层的内容,需要小伙伴自己处理

    <reference include="microsoft.ink, version=6.1.0.0, culture=neutral, publickeytoken=31bf3856ad364e35">
      <specificversion>true</specificversion>
    </reference>

我推荐下载微软的代码,然后构建,尝试运行,然后对比一下性能。这个方法能拿到最快的触摸信息,但是这个方法优化的仅是触摸收集,而对渲染没有做多少优化

更多请看微软文档 windows touch scratchpad using the real-time stylus sample (c#) – win32 apps

在 wpf 中默认的 stylusplugin 就使用了这部分优化,不需要额外的引用组件,如何在 wpf 中做高性能笔请看 wpf 高性能笔

本文会经常更新,请阅读原文: https://blog.lindexi.com/post/winforms-%e4%b8%8b%e7%9a%84%e9%ab%98%e6%80%a7%e8%83%bd%e7%ac%94%e8%bf%b9%e6%96%b9%e6%b3%95.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验