Мой код будет работать с х64 версией интерпретатора в х64 системе, и с х86 АХК в х86 ОС (виртуальной машины нет (не ставил), но думаю, что будет работать как задумано на х86, если меня проверите, будет замечательно):
If A_Is64bitOS And A_PtrSize=4 Or !A_Is64bitOS And A_PtrSize=8
{
MsgBox, 262160, % " ", % "Разрядность системы, должна быть"
. "`nодинаковой с разрядностью интепретатора!"
ExitApp
}
SetBatchLines, -1
DeviceGUID:="4D36E96C" ; media
;DeviceGUID:="4D36E96F" ; mouse
. "E325"
. "11CE"
. "BFC1"
. "08002BE10318"
VarSetCapacity(GUID, 16, 0)
NumPut("0x"SubStr(DeviceGUID, 1, 8), GUID, 0, "UInt")
NumPut("0x"SubStr(DeviceGUID, 9, 4), GUID, 4, "UShort")
NumPut("0x"SubStr(DeviceGUID, 13, 4), GUID, 6, "UShort")
Loop, 8
NumPut("0x"SubStr(DeviceGUID, 15+(A_Index*2), 2)
, GUID, 7+A_Index, "UChar")
hModule:=DllCall("LoadLibraryW", "Str", "setupapi.dll", "Ptr")
For Key In ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\"
. A_ComputerName "\root\cimv2")
.ExecQuery("select DeviceID, Name from Win32_SoundDevice")
;.ExecQuery("select DeviceID, Description from Win32_PnPEntity")
{
DeviceCount:=A_Index
If (Key.Name~="ASUS")
;If (Key.Description~="mouse")
{
InstanceID:=Key.DeviceID, DeviceName:=Key.Name
;InstanceID:=Key.DeviceID, DeviceName:=Key.Description
Break
}
}
OnExit, ExitScript
Space::
SetDeviceEnabled()
KeyWait, % A_ThisHotkey
Return
SetDeviceEnabled()
{
global GUID, DeviceCount, InstanceID, DeviceName
static Counter
Data:={}
hDevInfo:=DllCall("setupapi\SetupDiGetClassDevs", "Ptr", &GUID
, "Ptr", 0
, "Ptr", 0
, "UInt", DIGCF_PRESENT:=2
, "Ptr")
Loop, % DeviceCount+1
{
VarSetCapacity(SP_DEVINFO_DATA%A_Index%, sSize1:=A_PtrSize=4 ? 28:32, 0)
NumPut(sSize1, SP_DEVINFO_DATA%A_Index%, 0, "UInt")
DllCall("setupapi\SetupDiEnumDeviceInfo", "Ptr", hDevInfo
, "Int", A_Index-1
, "Ptr", &SP_DEVINFO_DATA%A_Index%)
Data.Insert(&SP_DEVINFO_DATA%A_Index%)
}
Index:=GetIndexOfInstance(hDevInfo, Data, InstanceID)
Counter++
For Key In ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\"
. A_ComputerName "\root\cimv2")
.ExecQuery("select Name, StatusInfo from Win32_SoundDevice")
;.ExecQuery("select Description, Status from Win32_PnPEntity")
If (Key.Name~="ASUS")
;If (Key.Description~="mouse")
{
IsState:=Key.StatusInfo=3 ? True:False
;IsState:=Key.Status="OK" ? True:False
Break
}
VarSetCapacity(SP_PROPCHANGE_PARAMS, sSize2:=20, 0)
NumPut(SP_CLASSINSTALL_HEADER:=8, SP_PROPCHANGE_PARAMS, 0)
NumPut(PropertyChange:=18, SP_PROPCHANGE_PARAMS, 4)
NumPut(StateChange:=IsState ? 2:1, SP_PROPCHANGE_PARAMS, 8)
NumPut(Scopes:=1, SP_PROPCHANGE_PARAMS, 12)
NumPut(HwProfile:=0, SP_PROPCHANGE_PARAMS, 16)
DllCall("setupapi\SetupDiSetClassInstallParams", "Ptr", hDevInfo
, "Ptr", Data[Index]
, "Ptr", &SP_PROPCHANGE_PARAMS
, "Int", sSize2)
bReturn:=DllCall("setupapi\SetupDiCallClassInstaller", "Int", PropertyChange
, "Ptr", hDevInfo
, "Ptr", Data[Index]
, "UInt")
If bReturn
TrayTip, % "State: is "(StateChange=1 ? "en":"dis")"able", % DeviceName
If !bReturn And Counter>1
MsgBox, 262160, % " ", % "Error occur", 1
Data:=""
}
GetIndexOfInstance(diSetHandle, diData, instanceId)
{
Loop, % diData.MaxIndex()
{
VarSetCapacity(DeviceInstanceId, 3, 0)
bReturn:=DllCall("setupapi\SetupDiGetDeviceInstanceId", "Ptr", diSetHandle
, "Ptr", diData[A_Index-1]
, "Ptr", &DeviceInstanceId
, "Int", 3
, "Int*", RequiredSize
, "UInt")
If (!bReturn And A_LastError=ERROR_INSUFFICIENT_BUFFER:=122)
{
VarSetCapacity(DeviceInstanceId, RequiredSize, 0)
DllCall("setupapi\SetupDiGetDeviceInstanceId", "Ptr", diSetHandle
, "Ptr", diData[A_Index-1]
, "Ptr", &DeviceInstanceId
, "Int", RequiredSize
, "Int*", RequiredSize)
If (StrGet(&DeviceInstanceId)=instanceId)
Return, A_Index-1
}
}
Return, -1
}
ExitScript:
DllCall("FreeLibrary", "Ptr", hModule)
ExitApp
У меня в разделе медия три устройства (две звуковых и один ТВ тюнер). Заметил, что всегда выдаст ошибку если воспроизводится трэк на пример в запущенном Winamp'е, с ТВ тюнером так же дело обстоит, плюс ещё нужно завершать процессы связаные с пультом ДУ.