electron 调用 devcon.exe 实现扫描检测硬件改动
公司某产品形态为显微镜 + 摄像头 + 软件,即可以理解为通过摄像头把显微镜下的视野内容显示到软件中。近期有不少客户反馈打开软件时,界面会黑屏,即看不到镜下的图像。因办公室环境一直没能重现,故猜测有可能的几种情况如下:
- 电脑未识别到摄像头设备;
- 摄像头驱动掉了;
- usb 数据线松动;
本文记录了针对情况 1 的处理方案,电脑未识别到摄像头时,设备管理器中的"图像设备"下是找不到该设备的,但是可以通过"扫描检测硬件改动"的操作让电脑重新检测系统接入的其他设备,那么这个功能如何集成到程序中呢?
经过一番 search 后,发现了一个叫 devcon.exe 的命令工具,安装步骤可见 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/devcon ,又或者直接从我的百度网盘下载:
链接:https://pan.baidu.com/s/16drMoIzl5OvaQIIrVzhMMw
提取码:wfi2
2
下载后配置好环境变量即可运行,我们先来测试一下,先运行
devcon -help
即可看到所有支持的命令
可以看到有一个 rescan 的命令,这个就是用来实现"扫描检测硬件改动"功能的命令,我们来试着执行一下试试
执行成功,接下来我们将 devcon.exe 放到前端的静态资源目录中,供客户端进行下载使用,在页面中先判断本地是否有 devcon.exe,有的话直接执行命令,没有的话先从服务器上下载,然后再执行命令,代码大致如下:
if (window.cr) {
let hasCommandTool = window.fs.existsSync('./devcon.exe');
if (!hasCommandTool) {
const response = await axios({
url: '/devcon.exe',
method: 'GET',
responseType: 'blob'
});
await this.saveBlob2File(response.data, './devcon.exe');
window.cr.exec(window.path.resolve('./') + '\\devcon.exe rescan', function(err, stdout) {
if (err) {
console.log(err)
alert('重置失败,请使用管理员身份运行智睫!');
} else {
console.log(stdout);
alert('重置成功,即将自动刷新!');
location.reload();
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这里需要注意,调用 devcon.exe 需要管理员权限,不然的话会 failed。至此,到客户发现黑屏的情况时,直接点击软件中的"重置"按钮即可重新扫描硬件改动尝试进行修复,具体使用情况以及是否从根本上解决了黑屏问题后面再更新。