相同型号设备(手机、耳机)同时插入电脑识别不同设备号问题

一 背景

    相同型号耳机或手机等设备插入电脑识别成播放或录音设备;更换相同型号产品时,产品会重新枚举,播放设备号不唯一。如图

                                          

如果插入多个相同型号头戴式耳机,设备名称枚举时会多带出一个数字“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工具可关注我,找我的上传,去下载。点击打开链接


猜你喜欢

转载自blog.csdn.net/weixin_42183571/article/details/80489300
今日推荐