dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息

WPF 框架自己实现了一套触摸机制,但同一窗口只能支持一套触摸机制,于是这会禁用系统的触摸消息(WM_TOUCH)。这能够很大程度提升 WPF 程序的触摸响应速度,但是很多时候又会产生一些 Bug。
如果你有需要,可以考虑禁用 WPF 的内置的实时触摸(RealTimeStylus)。本文介绍禁用方法,使用 AppSwitch,而不是网上广为流传的反射方法。

本文内容

    • 如何设置 AppSwitch
    • 反射禁用的方法
    • 此方法可以解决的问题一览
      • 拖拽窗口或者调整窗口大小时不能实时跟随的问题
      • 在部分设备上启动即崩溃
      • 在透明窗口上触摸会挡住 UWP 程序

如何设置 AppSwitch 在你的应用程序的 app.config 文件中加入 Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true 开关,即可关闭 WPF 内置的实时触摸,而改用 Windows 触摸消息(WM_TOUCH)。

如果你的解决方案中没有找到 app.config 文件,可以创建一个:
dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
文章图片

dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
文章图片

然后,把上面的代码拷贝进去即可。
反射禁用的方法 微软的官方文档也有提到使用放射禁用的方法,但一般不推荐这种调用内部 API 的方式,比较容易在 .NET 的版本更新中出现问题:
  • Disable the RealTimeStylus for WPF Applications - Microsoft Docs
  • WPF 禁用实时触摸 - 林德熙
此方法可以解决的问题一览 拖拽窗口或者调整窗口大小时不能实时跟随的问题
  • Why all my WPF applications fail to drag outside of their windows since Windows 10 (1809/1903) such as resizing the window or do drag drop? - Stack Overflow
  • All WPF applications fail to drag outside of their windows since Windows 10 (1809/1903) such as resizing the window or do drag drop · Issue #1323 · dotnet/wpf
dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
文章图片

在部分设备上启动即崩溃
  • .NET 4.7 - WPF - Touch Enabled Devices Crash Applications · Issue #480 · microsoft/dotnet
  • Visual Studio may freeze or crash when running on a pen-enabled machine - Developer Community
在透明窗口上触摸会挡住 UWP 程序
  • c# - On Windows 10 (1803), all applications lost touch or stylus if a WPF transparent window covers on them - Stack Overflow
参考资料
  • Disable the RealTimeStylus for WPF Applications - Microsoft Docs
  • WPF-Samples/runtimeconfig.template.json at master · microsoft/WPF-Samples
  • All WPF applications fail to drag outside of their windows since Windows 10 (1809/1903) such as resizing the window or do drag drop · Issue #1323 · dotnet/wpf
我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。
【dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息】如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。
dotnet|通过 AppSwitch 禁用 WPF 内置的触摸让 WPF 程序可以处理 Windows 触摸消息
文章图片

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

    推荐阅读