Не знал, что через WMI можно, но результат через COMSPEC меня более чем устроил. Даже больше подошёл к задаче.
Практически всё готово. Только описание позже перепишу, когда буду собирать скрипты. Возможно, сделаю его более подробным.
Код: Выделить всё
Pragma IncludeOnce
Global THREAD_SOUND = 0
Global RANDOM_SOUND = 0
Global RANDOM_DIRECTORY = ""
Global DirSounds = %COMMANDER_PATH% & "\Ini\Sounds\"
# 61900-61999
RegisterCommand 61980 "RegSoundScheme" 0
RegisterCommand 61981 "RegSoundScheme" 1
RegisterCommand 61982 "RegSoundScheme" 2
RegisterCommand 61983 "RegSoundScheme" 3
RegisterCommand 61984 "RegSoundScheme" 4
RegisterCommand 61985 "RegSoundScheme" 5
RegisterCommand 61986 "RegSoundScheme" 6
RegisterCommand 61987 "RegSoundScheme" 7
RegisterCommand 61988 "RegSoundScheme" 8
RegisterCommand 61989 "RegSoundScheme" 9
RegisterCommand 61990 "RegSoundScheme" 10
RegisterCommand 61991 "SoundDirectory" 1
RegisterCommand 61992 "SoundDirectory" 2
RegisterCommand 61993 "SoundDirectory" 3
RegisterCommand 61994 "SoundDirectory" 4
RegisterCommand 61995 "SoundDirectory" 5
RegisterCommand 61996 "SoundConsole"
RegisterCommand 61997 "RandomSounds" 1
RegisterCommand 61998 "RandomSounds" 2
RegisterCommand 61999 "RandomSounds" 3
# запуск потока
# если ключ Enable=1
RunThread ThreadSounds 0
Func SoundDirectory(lParam, wParam)
Local ini = DirSounds & "Sounds.ini", dir
If Not FileExist(ini) Then
MsgBox("Не найден " & ini, "Sounds", 48)
Return
Endif
IniRead dir %ini% "Custom" %"'Dir' & %wParam%" ""
Sleep(10)
IniWrite %ini% "Random" "Directory" %dir%
Sleep(100)
IniRead dir %ini% "Random" "Directory" ""
If dir = "" Then dir = "<Empty>"
MsgBox("Текущая директория: " & dir, "Sounds", 64)
EndFunc
Func SoundConsole(lParam)
Local key, val, count = 0
Local ini = DirSounds & "Sounds.ini", i, j, txt
If Not FileExist(ini) Then
MsgBox("Не найден " & ini, "Sounds", 48)
Return
Endif
Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
"WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")
While 1
txt = ''
For i = 0 To aNames.Count - 1
key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
val = RegRead(key, '', '')
#txt &= aNames[i] & auTAB & StrTrim(val) & auCRLF
cmd = "reg query " & key & " /ve"
ProcessExecGetOutput /OEM out %COMSPEC% "/c %cmd%"
txt &= StrTrim(out) & auCRLF & auCRLF
Next
count += 1
SetHintParam("ShowHint", "Font", 9, "Consolas")
SetHintParam("ShowHint", "BackColor", 0x00000000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Чтений: " & count & _
" Поток: " & (THREAD_SOUND = 0 ? "Нет" : "Да ") & _
" Режим: " & (RANDOM_SOUND = 0 ? "Нет" : RANDOM_SOUND) & auCRLF & StrTrim(txt))
j = 0
While j < 1000
Sleep(100)
j += 100
If IsPressed (0x1B) Then Break
Wend
SetHintParam("ShowHint", "Reload")
If IsPressed (0x1B) Then Break
Wend
Free(aNames)
ShowHint("Монитор значений остановлен")
EndFunc
Func RegSoundScheme(lParam, nItem)
Local ini = DirSounds & "Sounds.ini"
Local sect = "Scheme" & nItem, name, fold, desc
If THREAD_SOUND Then
MsgBox("Для регистрации схемы необходимо остановить случайный перебор файлов в каталоге" & auCRLF & auCRLF & _
"Корневой каталог: " & RANDOM_DIRECTORY, "Sounds")
Return
EndIf
If Not FileExist(ini) Then
ShowHint("Не найден " & ini)
Return
Endif
IniRead name %ini% %"%sect%" "Name"
IniRead fold %ini% %"%sect%" "Folder"
IniRead desc %ini% %"%sect%" "Description"
Local ErrNum = 0
Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
"WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")
# параметр 0
# отключение звуковой схемы
If nItem = 0 Then
For i = 0 To aNames.Count - 1
key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
RegWrite(key, "", "REG_SZ", "")
If ERROR = 1 Then ErrNum += 1
Next
Free(aNames)
RegWrite("HKCU\AppEvents\Schemes\Apps\Wincmd", "", "REG_SZ", "Total Commander")
If ErrNum = 0 Then
MsgBox("Звуковая схема отключена.", "Sounds", 64)
Else
MsgBox("Ошибок во время операции: " & ErrNum & auCRLF & auCRLF & _
"Звуковая схема отключена с ошибками.", "Sounds", 48)
Endif
Return
EndIf
# чтение и проверка конфигурации
Local aFiles = List(), ErrLog = ""
For i = 0 To aNames.Count-1
key = aNames[i]
IniRead val %ini% %"%sect%" %"%key%"
If val = "" Then
ErrLog &= "Пустое значение ключа <" & key & "> секции [" & sect & "]"
Break
EndIf
val = DirSounds & fold & "\" & val
If FileExist(val) Then
aFiles.Add(val)
Else
ErrLog &= val & auCRLF
Endif
Next
If StrLen(ErrLog) > 0 Then
MsgBox("Не найдены файлы схемы: " & auCRLF & auCRLF & ErrLog, "Sounds", 48)
Free(aNames, aFiles)
Return
Endif
# регистрация схемы
For i = 0 To aFiles.Count - 1
key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
RegWrite(key, "", "REG_SZ", aFiles[i])
If ERROR = 1 Then ErrNum +=1
Next
Free(aNames, aFiles)
RegWrite("HKCU\AppEvents\Schemes\Apps\Wincmd", "", "REG_SZ", "Total Commander")
If ErrNum = 0 Then
MsgBox("Схема """ & name & """ зарегистрирована", "Sounds", 64)
Else
MsgBox("Ошибок во время операции: " & ErrNum & auCRLF & auCRLF & _
"Звуковая схема зарегистрирована с ошибками.", "Sounds", 48)
Endif
EndFunc
# wParam:
# 1 - Все файлы
# 2 - Подкаталоги
# 3 - Остановить поток
Func RandomSounds(lParam, wParam)
# запуск потока
If wParam < 3 Then
If Not THREAD_SOUND Then
RunThread ThreadSounds %"%wParam%"
For i = 1 To 25
If THREAD_SOUND And RANDOM_SOUND Then
MsgBox("Случайный перебор включен" & auCRLF & auCRLF & "Корневой каталог: " & RANDOM_DIRECTORY, "Sounds", 64)
Return
EndIf
Sleep(100)
Next
Else
MsgBox("Поток уже запущен", "Sounds", 48)
EndIf
Endif
# остановка потока
If wParam = 3 Then
Local ini = DirSounds & "Sounds.ini"
IniWrite %ini% "Random" "Enable" 0
RANDOM_SOUND = false
For i = 1 To 25
If Not THREAD_SOUND Then
MsgBox("Случайный перебор остановлен", "Sounds", 64)
Return
EndIf
Sleep(100)
Next
Endif
EndFunc
Func ThreadSounds(RandMode)
Local debg = 1, intv, key, val, dir
Local ini = DirSounds & "Sounds.ini", out, i, j
If Not FileExist(ini) Then
MsgBox("Не найден " & ini, "Sounds", 48)
Return
Endif
# вызов из меню
If RandMode > 0 Then
IniWrite %ini% "Random" "Enable" 1
IniWrite %ini% "Random" "Mode" %RandMode%
EndIf
# авто
IniRead RANDOM_SOUND %ini% "Random" "Enable" 0
If Not RANDOM_SOUND Then Return
IniRead debg %ini% "Random" "Debug" 0
IniRead intv %ini% "Random" "Interval" 3000
If Not IsInt(intv) Or intv < 1000 Then intv = 1000
IniRead dir %ini% "Random" "Directory" ""
If dir = "" Then
dir = DirSounds
Else
If Not FileExist(dir) Then
MsgBox("Не найден каталог " & dir & auCRLF & auCRLF & "Источник " & ini, "Sounds", 48)
Return
EndIf
EndIf
# режим случайных значений
IniRead RANDOM_SOUND %ini% "Random" "Mode" 1
If Not IsInt(RANDOM_SOUND) Then RANDOM_SOUND = 1
If RANDOM_SOUND < 1 And RANDOM_SOUND > 2 Then RANDOM_SOUND = 1
# загрузка файлов в массив
ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %"%dir%"
Local aWav = List()
aWav.Text = out
If aWav.Count = 0 Or Not StrPos(aWav[0], ".wav") Then
MsgBox("Не найдены звуковые файлы *.wav в каталоге " & dir, "Sounds", 48)
Return
Endif
RANDOM_DIRECTORY = dir
# ключи в реестре
Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
"WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")
# вспомогательные массивы
# распределение случайного перебора
Local aVal = List(), aPos = List(), aEnd = List()
For i = 0 To aNames.Count-1
key = aNames[i]
If RANDOM_SOUND = 1 Then
val = "**"
Else
IniRead val %ini% "Random" %"%key%" "*"
EndIf
aVal.Add(val)
If val = "*" Then
aPos.Add(-1)
aEnd.Add(-1)
ElseIf val = "**" Then
aPos.Add(0)
aEnd.Add(aWav.Count-1)
Else
Local dir = "\" & val & "\", found = false
For j = 0 To aWav.Count-1
If StrPos(aWav[j], dir) Then
found = true
Break
EndIf
Next
If Not found Then j = -1
pos = j
aPos.Add(pos)
If pos > -1 Then
For j = pos To aWav.Count-1
If Not StrPos(aWav[j], dir) Then Break
Next
If j < aWav.Count-1 Then j = j - 1
aEnd.Add(j)
Else
aEnd.Add(-1)
EndIf
EndIf
Next
If debg Then
OutputDebugString("Autorun: aWav = " & aWav.Text)
OutputDebugString("Autorun: aVal = " & aVal.Text)
OutputDebugString("Autorun: aPos = " & aPos.Text)
OutputDebugString("Autorun: aEnd = " & aEnd.Text)
EndIf
THREAD_SOUND = 1
While RANDOM_SOUND
For i = 0 To aNames.Count - 1
If aPos[i] = -1 Then Continue
# случайные значения
val = aWav[Random(aPos[i], aEnd[i], 1)]
key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
# запись в реестр
RegWrite(key, "", "REG_SZ", val)
If debg Then
OutputDebugString("Autorun: key = " & key)
OutputDebugString("Autorun: val = " & val)
EndIf
Next
j = 0
While j < intv
Sleep(100)
j += 100
If Not RANDOM_SOUND Then Break
Wend
Wend
Free(aNames, aWav, aVal, aPos, aEnd)
THREAD_SOUND = 0
EndFunc
# все wav в каталоге
# простой алгоритм случайного выбора
Func ThreadSoundsDir
Local debg = 1, key, val
Local ini = DirSounds & "Sounds.ini", out, i
If Not FileExist(ini) Then
MsgBox("Не найден " & ini)
Return
Endif
ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %DirSounds%
Local aWav = List()
aWav.Text = out
Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
"WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")
While RANDOM_SOUND
For i = 0 To aNames.Count - 1
val = aWav[Random(0, aWav.Count-1, 1)]
key = "HKCU\AppEvents\Schemes\Apps\Wincmd\" & aNames[i] & "\.current"
RegWrite(key, "", "REG_SZ", val)
If debg Then
OutputDebugString("Autorun: key = " & key)
OutputDebugString("Autorun: val = " & val)
EndIf
Next
Sleep(1000)
Wend
Free(aNames, aWav)
EndFunc
Думаю, за неделю где-то сделаю. Надеюсь, по крайней мере.