在开发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. 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能

    葡萄城 AI 搜索接入 DeepSeek 在软件开发的广阔领域中,信息获取的效率直接影响开发进程的快慢.葡萄城始终致力于为开发者打造高效.智能的开发环境.自去年12月上线以来,AI 搜索功能已在帮助开 ...

  2. 【Matlab函数】提取inp文件中的节点、单元数据并保留集合信息

    功能 提取hypermesh2020(其他版本也可以)中的节点.单元信息,并保留elem set信息. 返回的是一个结构体 输入输出参数 输入: inp文件路径,如:'example.inp'.&qu ...

  3. abaqus建模时突发意外,软件闪退怎么才能找回操作?

    abaqus/CAE 建模的时候可能经常由于各种各样的原因闪退(中断.卡住.未响应等等.) 这是很让人崩溃的时候,一个良好的习惯就是经常Ctrl+S,并且操作的时候不要太急,否则abaqus容易反应不 ...

  4. 【ABAQUS 二次开发笔记】一次获得多个积分点的输出到dat

    当使用shell单元进行composite laminate 建模时,可以为每一指定Intergration point 的个数,默认是3个.(abaqus有很多variable可以在intergra ...

  5. 解密prompt系列50. RL用于优化Agent行为路径的一些思路

    OpenAI新推出的Deep Research功能,属实有些惊艳,也验证了去年的一些观点,之后的大模型工作流会呈现一些截然不同的形态,有敏捷型的例如语音端到端的及时对话,也会有异步长流程的复杂任务,去 ...

  6. 谷歌 Chrome 浏览器离线安装 vue devtools 插件

    由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法. 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学. 前 ...

  7. 地球OL攻略 —— 某应届生求职总结

    某应届生的苦逼求职总结 1.自我介绍,阐述一下自己过去的情况 2.目前的就业情况以及从事的就业方向 3.你在面试的时候遇到什么困难?是怎么帮忙解决的 4.当初为什么会选择选择这一行? 5.分享一下学习 ...

  8. Golang 1.16新特性-embed包及其使用

    embed 是什么 embed是在Go 1.16中新加入的包.它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力. 为什么需要 embed 包 ...

  9. VS 2022 WEB发布编译失败

    VS2022当安装在非默认路径时,每次更新后,在发布时,就会出来编译失败的提示,比如这样: C:\VS2022\Preview\MSBuild\Microsoft\VisualStudio\v17.0 ...

  10. http状态码413,并提示Request Entity Too Large的解决办法

    使用wordpress的用户经常遇到的问题,就是在后台上传多媒体文件的时候,发现文件大小是有限制的,通常是2M.如图: 如果上传的文件超过2M,服务端返回的状态码会是413,同时提示上传失败.实际上, ...