我正在开发与自定义USB设备交互的软件。 该设备呈现为HID设备,软件通过文件I / O与其交互。
由于Windows 8.1中的更改,操作系统不断重新启动设备,这会导致软件出现问题。
根据这个知识库文章: http : //support.microsoft.com/kb/2900614,Microsoftbuild议禁用USB设备的增强电源pipe理function,如果它有这个问题,手动完成后问题确实消失。
现在,我想修改软件的安装程序,以禁用所有设备的此设置,而不仅仅是针对特定的设备实例。
有没有办法做到这一点? 要么通过Windows API调用,要么通过会影响特定ProductID / VendorID组合的所有实例的registry设置?
例如,我想修改下的所有实例:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_11AE&PID_07CE
包括在安装程序执行后可能连接到系统的未来任何实例。
以下是我写的一个示例脚本,用于禁用所有Datalogic品牌USB设备(供应商ID 0x05F9)的电源管理。 您可能只需在For Each循环中更改条件下的“VID_05F9&”,使其与您需要修改的键匹配即可。 请注意,必要的UAC标高也被处理。
'Filename: USBPMFIX.VBS 'Author: Matthew Mellon <mmellon@ecrs.com> 'Date: 2014-12-12 'Desc: Disables enhanced power management on all Datalogic USB devices. 'License: This source code is released into the public domain. 'Checks if the script is running elevated (UAC) function isElevated Set shell = CreateObject("WScript.Shell") Set whoami = shell.Exec("whoami /groups") Set whoamiOutput = whoami.StdOut strWhoamiOutput = whoamiOutput.ReadAll If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then isElevated = True Else isElevated = False End If end function 'Re-runs the process prompting for priv elevation on re-run sub uacPrompt 'Check if we need to run in C or W script interpreter = "wscript.exe" If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then interpreter = "wscript.exe" else interpreter = "cscript.exe" end if 'Start a new instance with an elevation prompt first Set shellApp = CreateObject("Shell.Application") shellApp.ShellExecute interpreter, Chr(34) & WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 'End the non-elevated instance WScript.Quit end sub if not isElevated Then uacPrompt Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ strComputer & "\root\default:StdRegProv") strKeyPath = "SYSTEM\CurrentControlSet\Enum\USB" objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys For Each Subkey in arrSubKeys If Left(Subkey,9) = "VID_05F9&" And Left(Right(Subkey,6),5) = "&MI_0" Then strKeyPath = "SYSTEM\CurrentControlSet\Enum\USB\"+Subkey objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrInnerSubKeys For Each InnerSubkey in arrInnerSubKeys strFullKey = "SYSTEM\CurrentControlSet\Enum\USB\"+Subkey+"\"+InnerSubkey+"\Device Parameters" objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strFullKey, "EnhancedPowerManagementEnabled", 0 Next End If Next
您应该能够使用注册表功能来通过并动态更改导致您的问题的密钥。 我以前没有做过,但是我认为你可以在设备的自定义INF中作为安装步骤添加它,以确保它在新设备的每次安装时都会发生。
我不知道您是否能够控制设备固件,但是您可能会更改描述符,以便事先告诉操作系统它不支持像暂停或远程唤醒这样的电源管理。