;;====================================================================== ;; ;; Name: A.L.A.R.M. - A Laptop A/C Removal Monitor ;; Author: Uwe Dauernheim ;; E-Mail: uwe@dauernheim.net ;; License: GPL ;; Version: 1.0.0.0 ;; ;; With courtesy of Moritz Bartl for some of his usage ideas. ;; ;;====================================================================== #SingleInstance force WM_POWERBROADCAST = 0x218 WM_WTSSESSION_CHANGE = 0x2B1 PBT_APMPOWERSTATUSCHANGE = 0x000A NOTIFY_FOR_THIS_SESSION = 0 NOTIFY_FOR_ALL_SESSIONS = 1 WTS_SESSION_LOCK = 0x7 WTS_SESSION_UNLOCK = 0x8 OFFLINE = 0 ONLINE = 1 ALARM = MASTER_ONOFF = MASTER_MUTE = MASTER_VOLUME = WAVE_ONOFF = WAVE_MUTE = WAVE_VOLUME = PCSPEAKER_ONOFF = PCSPEAKER_MUTE = PCSPEAKER_VOLUME = ANALOG_ONOFF = ANALOG_MUTE = ANALOG_VOLUME = ;Menu, Tray, Icon, Notebook-Alarm.ico, 1 Menu, Tray, NoStandard Menu, Tray, Add, only when locked, doToggleLock Menu, Tray, Default, only when locked Menu, Tray, Add Menu, Tray, Tip, Notebook-Alarm Menu, Tray, Add, Test, doTest Menu, Tray, Add Menu, Tray, Add, Quit, doClose StringTrimRight, NASoundfile, A_ScriptName, 4 NASoundfile = %NASoundfile%.mp3 if (%0%) NASoundfile = %1% NALockToggle = 0 hWnd := DllCall("FindWindowEx", UInt, 0, UInt, 0, Str, "AutoHotkey", Str, a_ScriptFullPath " - AutoHotkey v" a_AhkVersion) DllCall("wtsapi32.dll\WTSRegisterSessionNotification", UInt, hWnd, UInt, NOTIFY_FOR_ALL_SESSIONS) OnMessage(WM_WTSSESSION_CHANGE, "WM_WTSSESSION_CHANGE") OnMessage(WM_POWERBROADCAST, "WM_POWERBROADCAST") Return ;======================================================================= doTest: AlarmStart() Return doToggleLock: Menu, Tray, ToggleCheck, Nur`, wenn gesperrt if (NALockToggle) NALockToggle = 0 else NALockToggle = 1 Return doClose: DllCall("wtsapi32\WTSUnRegisterSessionNotification", UInt, hWnd) ExitApp Return WM_POWERBROADCAST(wParam, lParam) { global ALARM = 1 loop { if (wParam & PBT_APMPOWERSTATUSCHANGE) { if (GetACLineStatus() == OFFLINE) { if (IsWorkstationLocked() || !NALockToggle) AlarmStart() } else if (GetACLineStatus() = ONLINE) AlarmStop() } if (ALARM = 0) break } } WM_WTSSESSION_CHANGE(wParam, lParam) { global if (wParam = WTS_SESSION_UNLOCK) AlarmStop() } AlarmStart() { global ; Lock Workstation DllCall("LockWorkStation") ; Save soundsettings SoundGet, MASTER_ONOFF, MASTER, ONOFF SoundGet, MASTER_MUTE, MASTER, MUTE SoundGet, MASTER_VOLUME, MASTER, VOLUME SoundGet, WAVE_ONOFF, WAVE, ONOFF SoundGet, WAVE_MUTE, WAVE, MUTE SoundGet, WAVE_VOLUME, WAVE, VOLUME ONOFF2Int(MASTER_ONOFF) ONOFF2Int(MASTER_MUTE) ONOFF2Int(WAVE_ONOFF) ONOFF2Int(WAVE_MUTE) ; Play alarm sound SoundSet, 1, MASTER, ONOFF SoundSet, 0, MASTER, MUTE SoundSet, 100, MASTER, VOLUME SoundSet, 1, WAVE, ONOFF SoundSet, 0, WAVE, MUTE SoundSet, 100, WAVE, VOLUME SoundPlay, %NASoundfile%, Wait error := ErrorLevel ; Restore soundsettings SoundSet, WAVE_ONOFF, WAVE, ONOFF SoundSet, WAVE_MUTE, WAVE, MUTE SoundSet, WAVE_VOLUME, WAVE, VOLUME if (error != 0) { ; Save soundsettings SoundGet, PCSPEAKER_ONOFF, PCSPEAKER, ONOFF SoundGet, PCSPEAKER_MUTE, PCSPEAKER, MUTE SoundGet, PCSPEAKER_VOLUME, PCSPEAKER, VOLUME SoundGet, ANALOG_ONOFF, ANALOG, ONOFF SoundGet, ANALOG_MUTE, ANALOG, MUTE SoundGet, ANALOG_VOLUME, ANALOG, VOLUME ONOFF2Int(PCSPEAKER_ONOFF) ONOFF2Int(PCSPEAKER_MUTE) ONOFF2Int(ANALOG_ONOFF) ONOFF2Int(ANALOG_MUTE) ; Could not play file -> Try using PC Speaker SoundSet, 1, PCSPEAKER, ONOFF SoundSet, 0, PCSPEAKER, MUTE SoundSet, 100, PCSPEAKER, VOLUME SoundSet, 1, ANALOG, ONOFF SoundSet, 0, ANALOG, MUTE SoundSet, 100, ANALOG, VOLUME loop 10 loop 7 SoundBeep, 1000 + Sin(A_Index) * 80, 80 ; Restore soundsettings SoundSet, PCSPEAKER_ONOFF, PCSPEAKER, ONOFF SoundSet, PCSPEAKER_MUTE, PCSPEAKER, MUTE SoundSet, PCSPEAKER_VOLUME, PCSPEAKER, VOLUME SoundSet, ANALOG_ONOFF, ANALOG, ONOFF SoundSet, ANALOG_MUTE, ANALOG, MUTE SoundSet, ANALOG_VOLUME, ANALOG, VOLUME } SoundSet, MASTER_ONOFF, MASTER, ONOFF SoundSet, MASTER_MUTE, MASTER, MUTE SoundSet, MASTER_VOLUME, MASTER, VOLUME } AlarmStop() { Soundplay, SOMEFILETHATDOESNOTEXIST ALARM = 0 } ;======================================================================= IsWorkstationLocked() { retVal := 0 hDesktop := DllCall("OpenDesktop", Str, "default", UInt, 0, Int, 0, UInt, 0x100) ; DESKTOP_SWITCHDESKTOP if (hDesktop) { retVal := !DllCall("SwitchDesktop", UInt, hDesktop) DllCall("CloseDesktop", UInt, hDesktop) } return retVal } GetACLineStatus() { VarSetCapacity(lpSystemPowerStatus, 12, 0) DllCall("GetSystemPowerStatus", UInt, &lpSystemPowerStatus) return ExtractInteger(lpSystemPowerStatus, 0, true, 1) } ExtractInteger(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4) { Loop %pSize% result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1) if (!pIsSigned OR pSize > 4 OR result < 0x80000000) return result return -(0xFFFFFFFF - result + 1) } ONOFF2Int(ByRef Var) { if (strlen(Var) = 2) ; ^= On Var = 1 else ; ^= Off Var = 0 }