相同型号设备(手机、耳机)同时插入电脑识别不同设备号问题
一 背景
相同型号耳机或手机等设备插入电脑识别成播放或录音设备;更换相同型号产品时,产品会重新枚举,播放设备号不唯一。如图
如果插入多个相同型号头戴式耳机,设备名称枚举时会多带出一个数字“2”或者其他。
二 解决方法
1 修改注册表
1 .1 实现步骤:
开始--->运行--->输入“regedit” 进入注册表
选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags
右键->新建->二进制值->输入名称“ignorehwsernum+VID+PID”->修改数值数据01
1.2 问题缺陷
此方法在Windows7 系统有时不生效;有时添加上注册表前期测试OK,后期注册表失效。
Windows10系统暂时没有发现问题。
二 删除注册表内的枚举信息
直接操作注册表删除表内枚举信息是删除不了的,会报错:权限不足。至今,未能找到开取删除枚举信息权限。发现使用PsTools工具可以远程控制本机,此时,权限为最高。
2.1 实现步骤
下载一个PsTools工具,解压将其放置在C盘,编辑两个bat文件以便处理CMD命令
Bat文件内容:(1.bat):
@echo off
cd C:\PsTools
psexec -i -d -s cmd.exe
exit
(2.bat):
regdelete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_XXXX&PID_XXXX&MI_00"
红色字体部分就是产品播放设备枚举信息的路径
执行1.bat 会弹出cmd命令窗
命令窗内输入2.bat,再输入”Yes”,显示“操作成功完成”,即删除成功。
三 C#代码实现
1. 调用1.bat,核心实现:
Process process = newProcess();
ProcessStartInfoprocessStartInfo = newProcessStartInfo();
intnum = sBatFilePath.LastIndexOf('\\');
stringworkingDirectory = sBatFilePath.Substring(0, num + 1);
stringtext = sBatFilePath.Substring(num + 1, sBatFilePath.Length - (num + 1));
processStartInfo.FileName =sBatFilePath;
processStartInfo.WorkingDirectory =workingDirectory;
processStartInfo.UseShellExecute = false;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
process.StartInfo = processStartInfo;
process.Start();
Thread.Sleep(1000);
process.Close();
2. 调用2.bat,(调用完1.bat会弹出cmd命令窗,通过findwindows找到窗体给命令窗发指令) 核心实现:
IntPtr intptr =FindWindow(null, @"管理员: C:\Windows\System32\cmd.exe");
int num1 = SetForegroundWindow(intptr);
Application.DoEvents();
Thread.Sleep(100);
SendKeys.SendWait(@"C:\PsTools\2.bat");
Thread.Sleep(50);
SendKeys.SendWait("{Enter}");
Thread.Sleep(50);
SendKeys.SendWait("Yes");
SendKeys.SendWait("{Enter}");
Thread.Sleep(50);
SendKeys.SendWait("exit");
SendKeys.SendWait("{Enter}");
PsTools工具可关注我,找我的上传,去下载。点击打开链接