c# - WPF 应用程序在添加或删除平板设备后停止响应触摸
问题描述
在当前 CPU 使用率较高的计算机上运行任何 WPF 应用程序,如果您同时插入和拔出 USB HID 平板设备,WPF 应用程序将停止响应触摸,仅响应鼠标。
要求:
- 运行任何WPF 应用程序
- 继续插拔 USB HID 平板设备
- 使CPU使用率高
我的问题:
我们非微软开发人员有什么彻底的方法来解决这个触摸失败吗?
我在这里发布了对触摸失败的初步分析:
这篇文章对于 StackOverflow 来说有点长,这里只提一些结论:
GetPenEventMultiple
下面的帖子可能会出现死锁。- 可能还有其他线程安全问题
GetTabletInfoHelper
。
下面的代码来自 .NET Framework,为了便于理解,我对其进行了简化:
// PenThreadWorker.ThreadProc
while(There are two loops in real)
{
// The `break` below only exit one loop, not two.
if (this._handles.Length == 1)
{
if (!GetPenEvent(this._handles[0], otherArgs))
{
break;
}
}
else if (!GetPenEventMultiple(this._handles, otherArgs))
{
break;
}
// Other logics.
}
// WorkerOperationGetTabletsInfo.OnDoWork
try
{
_tabletDeviceInfo = PenThreadWorker.GetTabletInfoHelper(pimcTablet);
}
catch(COMException)
{
_tabletDevicesInfo = new TabletDeviceInfo[0];
}
catch(ArgumentException)
{
_tabletDevicesInfo = new TabletDeviceInfo[0];
}
// Other exception handling.
解决方案
如果硬件设备反复连接和断开连接,您的操作系统最终会因资源使用而崩溃、陷入困境或以其他方式损坏内存。
建议您将 WPF 桌面应用程序更改为不执行任何操作,直到用户连接平板电脑并单击 WPF 桌面应用程序中的按钮以“启用平板电脑”支持。
否则,您将让一些用户使用坏的 USB 电缆反复连接和断开平板电脑。
操作系统将无法像处理故障磁盘控制器一样处理设备。
推荐阅读
- java - 如何在java8中将对象数组转换为用户定义的对象
- vuejs2 - Vuejs2-从“v-model”获取动态值,计算全部并显示在计算属性中
- wpf - 在运行时将列动态添加到数据网格
- c# - WebSocketOptions 忽略接收缓冲区大小
- javascript - 值是连接而不是相加的
- node.js - 如何避免错误:发送后无法设置标头?
- python - 用布尔值旋转的熊猫
- kubernetes - Docker for Mac - Kubernetes - 参考本地镜像
- jasmine - 如何使用量角器打印元素列表以进行控制台
- apostrophe-cms - Ajax 调用更改浏览器 url