A.L.A.R.M. - A Laptop A/C Removal Monitor

Endgültiges Löschen, Passwortverwaltung, etc.

Moderatoren: |Gordon|, Jean, Moderatoren

Antworten
mbartl
Einsteiger
Beiträge: 3
Registriert: 20.09.06, 23:53

A.L.A.R.M. - A Laptop A/C Removal Monitor

Beitrag von mbartl » 21.09.06, 0:07

Name: A.L.A.R.M. - A Laptop A/C Removal Monitor
Version: 1.01
Grösse: 638kb
Homepage: http://alarm.sourceforge.net/
Download: http://sourceforge.net/project/showfile ... _id=177684
Supportforum: http://www.headstrong.de/cgi-bin/board/ ... oard=alarm
Lizenz: GPL/Free
Screenshot: http://alarm.sourceforge.net/images/alarm-settings.gif
Standalone? Ja, aber auch Installer verfügbar.
Admin-Rechte nötig? Nein.
Beschreibung:
Sie sind mit dem Laptop in einer unsicheren Umgebung, z.B. in der Bibliothek, Universitaet, Arbeit, und Sie müssen den Rechner kurz alleine lassen? Wenn der Computer gesperrt ist, signalisiert A.L.A.R.M. das Entfernen des Stromkabels mit einem lauten Signalton, der frei gewaehlt werden kann. Einfache Diebstahlsicherung. Freeware, kostenlos, Quellcode frei verfügbar.
Für mehr Informationen schaut einfach auf der Homepage vorbei. Würde mich über Kommentare freuen!
Zuletzt geändert von mbartl am 21.09.06, 11:17, insgesamt 1-mal geändert.

Benutzeravatar
likeatim
Gründer und Administrator
Beiträge: 2658
Registriert: 24.08.01, 13:01

Beitrag von likeatim » 21.09.06, 7:45

Das geht aber nur, wenn ich den Systemsound auf "an" habe. oder?
In der Bib ist meine Lautstärke aber immer auf Null, damit nicht beim Hoch-/Runterfahren oder überraschenderweise Töne nerven.
Könnte das dann auch einen Piepton wie beim Virenscanner auslösen? Der geht immer....

Kreisquadratur
Mitglied
Beiträge: 113
Registriert: 03.12.03, 21:54

Beitrag von Kreisquadratur » 21.09.06, 10:53

Ich hatte auch einmal den Wunsch nach solch einem Programm und hab es nach meinem Bedürfnis in AutoHotkey umgesetzt. Falls jemand Interesse hat: (Gibt auch ein kleines nettes Icon dafür)

Code: Alles auswählen

#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, Nur`, wenn gesperrt, doToggleLock
Menu, Tray, Default, Nur`, wenn gesperrt
Menu, Tray, Add
Menu, Tray, Tip, Notebook-Alarm
Menu, Tray, Add, Testen, doTest
Menu, Tray, Add
Menu, Tray, Add, Beenden, 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
	
}
Zuletzt geändert von Kreisquadratur am 21.09.06, 20:24, insgesamt 4-mal geändert.

mbartl
Einsteiger
Beiträge: 3
Registriert: 20.09.06, 23:53

Beitrag von mbartl » 21.09.06, 10:56

@Kreisquadratur: Nettes Script, gute Idee. Allerdings überprüfst du nicht ob die Workstation gerade gesperrt ist (sondern sperrst sie dadurch), das war mir für meine Zwecke wichtig - ich will ja auch mal das Stromkabel ziehen ohne dass gleich der Alarm losgeht. Aber als Option im Programm ist das auch nicht schlecht, ich denke das nehme ich in die nächste Version mit auf. :)
Wenn du damit einverstanden bist würde ich das Script gerne mit auf die Sourceforge-Seite von A.L.A.R.M. stellen? Natürlich mit "proper Credits".

@likeatim: Im Moment nutze ich TMediaPlayer und somit die "Soundkarte" (ich habe keine Systemsounds o.ä., die nerven sowieso nur).
Ich habe mit MessageBeep der Windows-API experimentiert, aber konnte damit an meinem Laptop keinerlei Töne erzeugen, deshalb habe ich es wieder herausgenommen. Du weisst nicht zufällig, wie genau der Piepton beim Virenscanner erzeugt wird?
Wenn du softwaremässig die Lautstärke auf Null stellst (mein Laptop hat ein "analoges" Rädchen): A.L.A.R.M. sollte sie auf 100% vor Alarmauslösung stellen, dadurch dass das aber bei meinem Laptop nicht funktionieren will bisher aber danach nicht wieder zurück. Würde mich freuen wenn du es kurz ausprobieren könntest, du kannst z.B. das Binary irgendwohin entpacken, in den Settings ein beliebiges Soundfile wählen und dann den Button zum Testen verwenden (siehe Screenshot) - der verwendet die selben Routinen wie der Alarm selbst.

Nachtrag: Ich habe mich ein wenig "schlau gemacht". Ich werde in der nächsten Version vor dem Alarm die Lautstärkeeinstellungen speichern, Wave und Master auf 100% setzen und Mute deaktivieren (so wie das Script oben), und nach dem Alarm (wenn also wieder Strom da ist oder der PC entsperrt) entsprechend zurücksetzen.
Ton über den "PC-Speaker" erzeugen kann ich leider wie gesagt im Moment nicht testen, da mein Laptop keinen solchen Speaker besitzt. Das folgt dann später, im Oktober oder November.

mbartl
Einsteiger
Beiträge: 3
Registriert: 20.09.06, 23:53

Beitrag von mbartl » 22.09.06, 13:27

Inzwischen gibt es das AutoHotkey-Script von Kreisquadratur in einer erweiterten Fassung auch auf der ALARM-Homepage.

Antworten