teadrinker пишет:Можно получить букву подключаемого/отключаемого диска:
…
Воспользовался Вашим кодом встроив его в свой скрипт, но полезли ошибки:
---------------------------
MasterScript.ahk
---------------------------
Error: 0x8001010D - Не удается выполнить исходящий вызов, так как приложение обрабатывает входящий синхронный вызов.
Line#
493: scriptsOldSnapshot := []
494: Else
495: scriptsOldSnapshot := scriptsSnapshot
496: processesSnapshot := []
496: scriptsSnapshot := []
496: indexScripts := 0
496: indexProcesses := 0
---> 497: For Process, in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
498: {
499: indexProcesses += 1
500: processesSnapshot[indexProcesses, "pid"] := Process.ProcessId
501: processesSnapshot[indexProcesses, "exe"] := Process.ExecutablePath
503: if (RegExMatch(Process.CommandLine, "Si)^(""|\s)*\Q" A_AhkPath "\E.*\\(?<Name>.*\.ahk)(""|\s)*$", script)) && (RegExMatch(Process.CommandLine, "Si)^(""|\s)*\Q" A_AhkPath "\E.*""(?<Path>.*\.ahk)(""|\s)*$", script))
504: {
505: indexScripts += 1
Continue running the script?
---------------------------
Да Нет
---------------------------
Как понятно из процитированного в ошибке кода из моего скрипта - я использую ComObjGet для получения списка запущенных процессов, что и стало причиной конфликта с предложенным тобой OnMessage(0x219, "WM_DEVICECHANGE").
Я про синхронность/асинхронность вызовов мало чего знаю (ведь, я не настоящий сварщик), скажите пожалуйста: как избавиться от подобных ошибок?
Т. к. OnMessage() ловит входящие вызовы, то такой вызов всегда может попасться на момент, когда в скрипте ещё выполняется исходящий вызов ComObjGet, что неминуемо приведёт к процитированной выше ошибке.
Единственным выходом, который мне видится возможным (но очень нежелательным) - это запустить этот OnMessage() в отдельном скрипте, к которому периодически обращаться (исходящими вызовами) из основного скрипта и опрашивать его на наличие новых событий.
Есть ли вариант лучше?