前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么 WPF 软件在 win7 启动时会尝试调起 wisptis 进程

为什么 WPF 软件在 win7 启动时会尝试调起 wisptis 进程

作者头像
林德熙
发布2020-02-17 14:53:53
8580
发布2020-02-17 14:53:53
举报
文章被收录于专栏:林德熙的博客林德熙的博客

我看到一个问题是在 win7 系统上,如果开机启动的软件是 WPF 软件,而这个 WPF 软件在系统的 wisptis 进程启动之前就启动了,那么 WPF 将会调起 wisptis 进程。而在 wisptis 进程已经启动完成,此时启动 WPF 进程不会再打开新的 wisptis 进程。但是被 WPF 启动的 wisptis 进程存在这样的问题,在触摸屏上 win7 的双指打开右键菜单等功能不可用

在 WPF 启动时,将会在 Window 类的 Visibility 修改时调用到 WispLogic.RegisterHwndForInput 方法进行初始化触摸,这部分详细请看 WPF 触摸到事件 而在初始化触摸时,需要用到 PenIMC 的逻辑

在 win7 系统上,触摸需要通过 wisptis 进程的辅助才能让 WPF 进程能够完成实时触摸,这里的 wisptis 是 Windows Ink Services Platform Tablet Input Subsystem 进程,用于处理触摸书写等功能。也是 RealTimeStylus 的提供,通过一些不靠谱的文档和经验,其实 PenIMC 的核心逻辑就是 RealTimeStylus 提供的。上面这句话对或不对我不敢说,只能说用 RealTimeStylus 可以实现 PenIMC 的效果,而且 API 和参数差不多

那么 PenIMC 又是什么呢?其实 PenIMC 是 penimc2_v0400.dll 文件,在不同的版本的 .NET Framework 和系统上这个文件是不同的,包括文件名也不同,看这个文件命名就知道。没错,你可以在 penimc2_v0400.dll 文件所在的文件夹找到一堆 penimc 文件。这个文件就是提供给 WPF 的触摸核心 PenThreadWorker 的 COM 组件(其实没有文档说这货是纯 COM 组件) 也就是和触摸相关的

也就是在 WPF 窗口打开显示将会初始化触摸,初始化触摸需要依赖 PenIMC 而假设这个库本质是 RealTimeStylus 的封装,那么依赖于 win7 的 Windows Ink Services Platform Tablet Input Subsystem 服务,此时在我看不到的代码判断了 wisptis 进程的启动

而为什么 WPF 启动的 wisptis 进程有很多坑?只是启动进程权限问题,更详细我也不知道

规避方法是什么?其实不让触摸执行也就是可以了,但是我如何让 WPF 还能交互?没关系,假装自己是一个古老的应用,只支持鼠标消息就可以啦。但是我想要做多指触摸怎么办?先不要触摸,等待 wisptis 进程启动之后,通过 WPF 模拟触摸设备 方案重新注册一遍触摸

我一开始启动太快了,没关系,我一开始启动的是一个 win32 的启动图,等待后台逻辑判断 wisptis 启动之后,我才打开 WPF 的窗口。根据上面的说法,其实窗口没有修改 Visiliblity 之前是不会初始化触摸的,也就是不会启动 wisptis 进程的

现在 win7 已经不受微软支持了,是时候升级 win10 啦

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档