Хорошо, я нашел решение, которое сработало для меня;инструмент AutoHotkey_L и скрипт, созданный в соответствии с этими потоков на форумах AutoHotkey.
Это код, который я использую, и я предлагаю прочитатьКоманды AutoHotkey в документации .Я настраиваю код, когда узнаю, что он на самом деле делает, но пока это работает.:)
#NoEnv
#Persistent
SendMode Input
SetWorkingDir %A_ScriptDir%
SetTimer, RunBeforeShutdown, Off
Gui,+LastFound
hwnd:=WinExist()
DllCall("ShutdownBlockReasonCreate","Uint",hwnd,"Str","")
DllCall("kernel32.dll\SetProcessShutdownParameters", UInt, 0x4FF, UInt, 0)
;puts us first in line for getting the shutdown call, i guess?
OnMessage(0x11, "WM_QUERYENDSESSION")
Return
WM_QUERYENDSESSION(wParam, lParam)
{
ENDSESSION_Logoff = 2147483648
If (lParam == ENDSESSION_Logoff) {
global EventType = "Logoff"
} Else {
global EventType = "Shutdown"
;no way to distinguish between shutdown and restart
}
SetTimer, RunBeforeShutdown, On
Return false
}
runBeforeShutdown:
SetTimer, RunBeforeShutdown, Off
Sleep, 1000
SendInput, {ENTER} ; gets us past the 'Force shudown' screen
Sleep, 1000
#SingleInstance, Force
DllCall("ShutdownBlockReasonDestroy","Uint",hwnd)
; **** Your commands go here ****
RunWait shutdown.bat
; ********
If (EventType == "Logoff") {
Shutdown, 0
} Else {
Shutdown, 1
}
Reload
Return
Так что сейчас он различает только выход из системы и завершение работы, но этот пост имеет простой графический интерфейс в HTML, который позволяет пользователю выбирать, хотите ли он перезапустить, перевести в спящий режим и т. Д..
В моем случае можно прервать завершение работы и запустить пакетный файл независимо от того, работает VMware или нет, но вы можете установить для него условие, например, так:
IfWinExist, ahk_class VMPlayerFrame {
SetTimer, RunBeforeShutdown, On
Return false
} Else {
Return true
}
У меня уже были проблемы с этим сценарием, например, когда хост настолько замедлен (утечка памяти), что экран «Force shudown» не появится вовремя, чтобы скрипт закрыл его.И, вероятно, было бы полезно отслеживать количество попыток, чтобы можно было принудительно завершить работу, если первая попытка не удалась.
По крайней мере, на данный момент достаточно.И мне может даже не понадобиться виртуализация для моего проекта, но, надеюсь, она может помочь кому-то еще.Альтернативные решения по-прежнему очень приветствуются.