在开发OPS项目,发现插拔式的OPS在切换系统、开关机、重启,会时不时出现部分WPF开机自启的 应用触摸失效的问题。而且出现问题的应用都是全屏窗口应用。用snoop 附加上去,没有Touch 和Stylus的 的相关事件,但是鼠标事件是能触发的,而且系统的其他的应用软件都可以触摸。这就是我们常见的WPF应用的触摸失效的一些案例事件。

以下记录WPF应用启动检测触摸失效的方法

 1、检测系统是否存在触摸设备

  [DllImport("user32.dll")]
public static extern int GetSystemMetrics(int nIndex); public static bool DetectSystemTablet() => GetSystemMetrics(94) > 0 || GetSystemMetrics(95) > 0 || GetSystemMetrics(86) > 0;

2、检测WPF 是否加载了触摸设备

 public static bool DetectFrameworkTablet() => Tablet.TabletDevices.Count > 0;

3、检测是否检测到触摸数字化器,输入的触摸设备(需要引用WinRT,nuget包引用:Microsoft.Windows.SDK.Contract)

 private static bool IsTouchEnabledSystem()
{
var touchCapabilities = new TouchCapabilities();
var isTouch = touchCapabilities.TouchPresent > 0;
return isTouch;
}

4、是否存在触摸设备尺寸

  public static bool ExistTabletSize()
{
bool flag = false;
foreach (TabletDevice tabletDevice in (IEnumerable) Tablet.TabletDevices)
{
PropertyInfo property = tabletDevice.GetType().GetProperty("TabletDeviceImpl", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty);
object obj = (object) property == null ? (object) tabletDevice : property.GetValue((object) tabletDevice);
if (obj.GetType().GetProperty("TabletSize", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty)?.GetValue(obj, (object[]) null) is Size size && tabletDevice.StylusDevices.Count > 0 && size.Width > 0)
flag = true;
if (flag)
break;
}
return flag;
}

5、FirstChanceException 监听触笔 异常

   AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;

private void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
AppDomain.CurrentDomain.FirstChanceException -= CurrentDomain_FirstChanceException;
try
{
if (e.Exception.StackTrace.Contains("Penimc.IPimcManager2.GetTablet"))
{
//todo
}
else if (e.Exception.StackTrace.Contains("Windows.Input.StylusWisp.WispLogic.RegisterStylusDeviceCore"))
{
//todo
}
}
finally
{
AppDomain.CurrentDomain.FirstChanceException -= CurrentDomain_FirstChanceException;
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
}
}

由于之前的应用的判断,我们只采用到了1、2的俩种方式组合判断,发现还是会存在触摸失效的。于是在相关的应用上增加了3、4的方法,并增加了日志打印,发现在存在 系统触摸设备,并且WPF应用存在触摸个数的情况下,3、4的返回结果是触摸异常的

总结:

由于WPF应用触摸失效的场景非常的多,并且很诡异,目前以上的几种方式只能通过检测异常重启应用的方式去规避的。

WPF应用启动时,检测触摸失效的几种方式的更多相关文章

  1. Java项目启动时执行指定方法的几种方式

    很多时候我们都会碰到需要在程序启动时去执行的方法,比如说去读取某个配置,预加载缓存,定时任务的初始化等.这里给出几种解决方案供大家参考. 1. 使用@PostConstruct注解 这个注解呢,可以在 ...

  2. java Web 启动时自动执行代码的几种方式

    Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...

  3. Spring Boot 启动时自动执行代码的几种方式

    来源:https://mp.weixin.qq.com/s/xHAYFaNBRys3iokdJmhzHA 前言 java自身的启动时加载方式 Spring启动时加载方式 代码测试 总结 1.前言 目前 ...

  4. 检测对象类型的两种方式,constructor属性和instanceof

    //本例是为了记录检测对象类型的两种方式,即constructor属性和instanceof操作符.详见<高三>P145        function Person(name, age, ...

  5. WPF窗口启动时最大化

    在xaml对应的后台代码文件的初始化方法中: public ShellView() { InitializeComponent(); #region 启动时串口最大化显示 Rect rc = Syst ...

  6. U盘启动时提示starting cmain,3种终极解决方案

    U盘启动时提示“starting cmain”一般是这样子的: <ignore_js_op> 这种情况,一般是制作好了PE启动U盘之后,启动不了才会这样,一般正常情况的话,这一句英文是一闪 ...

  7. WPF -- 使用当前进程打开自定义文件的一种方式

    问题描述 当双击打开自定义格式的文件时,希望使用当前正在运行的进程,而不是另起一个进程. 本文介绍一种方式解决如上问题,方案参考user3582780的解答 设置自定义文件格式的默认打开方式 参考链接 ...

  8. tomcat启动时检测到循环继承而栈溢出的问题:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/test] due to a StackOverflowError. Possible root causes include

    最近在公司更新一个老项目的时候,发现部署项目后tomcat报错,错误如下: Caused by: java.lang.IllegalStateException: Unable to complete ...

  9. WPF APP 启动时增加特殊逻辑

    public partial class App : Application { public App() { this.Startup += (o1, e1)=>{ string comman ...

  10. ORA-00060:等待资源时检测到死锁的一种处理方法

    先执行脚本: SELECT p.sipid, a.serial#, c.object_name, b.session_id, b.oracle_username, b.os_user_name FRO ...

随机推荐

  1. burpsuite激活

    激活burpsuite--教程 点击Start 文件,把三个框都选上 点击RUN,会自动启动,复制一下那个证书 粘贴刚刚复制的密钥,点击下一个即可 这里点击手动激活,复制请求,粘贴到刚刚那个激活程序的 ...

  2. thinkphp6实现仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论

    功能:仿微信朋友圈,用户可发布图片和文字内容,用户可评论,其他用户可评论文章,也可回复用户评论,多层级评论,无限级评论数据库示例:朋友圈内容表 article表:id content image li ...

  3. 带大家做了个 AI 项目,没想到这么简单!

    大家好,我是程序员鱼皮,现在已经是全民 AI 时代了,咱们程序员更要想办法榨干 AI,把 AI 利用起来.前几天我一时兴起,直播用 2 多个小时的时间,从需求分析开始,带大家做了一个 AI 海龟汤游戏 ...

  4. `go install`指令行为分析

    分析go install [build flags] [packages]指令做了什么,如何实现安装GO软件,我们如何编写一个软件使得可以使用该指令安装自己编写的程序. 参考go官方文档 安装位置 $ ...

  5. python3 ModuleNotFoundError: No module named 'CommandNotFound'

    前言 python3 报错:ModuleNotFoundError: No module named 'CommandNotFound' 这是 linux 安装多版本 python 时的一个遗留问题, ...

  6. Prometheus Go client library 详解

    介绍 Prometheus 支持 4 种 指标类型,分别是 Counter.Gauge.Histogram 和 Summary. Counter 指标类型,指标值是只能递增,不能递减的数值.需要注意的 ...

  7. Golang 入门 : 常量

    常量 相对于变量而言,常量是在程序使用过程中,不会改变的数据.有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变.例如 圆周率 在程序执行过程中不会改变. 常量的声明 const Pi f ...

  8. 这是base-还原数字查正确码表再解码

    题目: dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 1 ...

  9. Netty源码—3.Reactor线程模型二

    大纲 5.NioEventLoop的执行总体框架 6.Reactor线程执行一次事件轮询 7.Reactor线程处理产生IO事件的Channel 8.Reactor线程处理任务队列之添加任务 9.Re ...

  10. 【虚拟机】Windows(x86)上部署ARM虚拟机(Ubuntu)

    [虚拟机]Windows(x86)上部署ARM虚拟机(Ubuntu) 零.起因 最近在学嵌入式,这就不得不涉及ARM指令集,但是电脑是x86指令集的,用手机不太方便,买开发板又要等几天--,总之就是要 ...