1

Тема: AHK: Отслеживание событий смены сеанса, выключения, перезагрузки

Следующий скрипт, насколько могу судить, отслеживает события выключения-перезагрузки и выхода из сеанса.
Возможно ли в нём как-нибудь "развести" первые два события так, чтобы перед ними показывался соответствующий им MsgBox?


#SingleInstance Force

SetTimer, RunBeforeShutdown, Off
DllCall("kernel32.dll\SetProcessShutdownParameters", UInt, 0x4FF, UInt, 0)
OnMessage(0x11, "WM_QUERYENDSESSION")
Return


WM_QUERYENDSESSION(wParam, lParam)
  {
    static sdtry = 0
    ENDSESSION_Logoff = 0x80000000
    If (lParam & ENDSESSION_Logoff) ; User is logging off.
      EventType = Logoff
    Else     ; System is either shutting down or restarting. and
      EventType = Shutdown
    If (EventType = "Shutdown" or "Logoff" and sdtry = 0){
      sdtry = 1
      SetTimer, RunBeforeShutdown, On
      Return false ; Tell the OS to Abort the Shutdown/Logoff.
    }
    Else If (EventType = "Shutdown" or "Logoff" and sdtry = 1)
      Return true
  }


runBeforeShutdown:
  SetTimer, RunBeforeShutdown, Off


  If (EventType = "Shutdown")
    MsgBox, Shutdown
  Else
    MsgBox, Logoff


Reload

2

Re: AHK: Отслеживание событий смены сеанса, выключения, перезагрузки

WM_QUERYENDSESSION три варианта lParam, однозначно указывающего на перезагрузку — нет.

3

Re: AHK: Отслеживание событий смены сеанса, выключения, перезагрузки

Ваше "однозначно" несколько оживляет минорный контекст, добавляет ему огонька, что ли...
Верно ли понял — отличать перезагрузку от выключения как-то можно?

4

Re: AHK: Отслеживание событий смены сеанса, выключения, перезагрузки

Так ведь ENDSESSION_Logoff неоднозначно указывает на перезагрузку
Наверняка можно, способ мне неизвестен.