Seite 1 von 1

Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 02:22
von STARGÅTE
Tachchen Leute,

ich hatte eben die witzige Idee, mal den zurückgelegten Weg meiner Maus(-cursor) (im Laufe des Tages/Woche/Monat...) zu messen.
Mit diesem Code hier (den ihr auch zu einer EXE machen könnt) wird der Weg gemessen. Ihr könnt die Exe dann auch in den Autostart verknüpfen, dann startet die Mauswegmesser automatisch. Der letzte Weg wird beim beenden und alle 10s gespeichert.

Code: Alles auswählen

Enumeration
	#Window
	#SysTrayIcon
	#Menu
	#MenuItem_Quit
	#MenuItem_Factor
	#Timer
EndEnumeration

Global Length.d, Factor.d, Time.d

Procedure SaveConfiguration()
	OpenPreferences(GetEnvironmentVariable("APPDATA")+"\Mauswegmesser.ini")
	WritePreferenceDouble("Factor", Factor)
	WritePreferenceDouble("Length", Length)
	ClosePreferences()
EndProcedure

Define OldX.i, OldY.i, X.i, Y.i, ToolTip.s, Zoll.d

UsePNGImageDecoder()
ExamineDesktops()

OpenWindow(#Window, 0, 0, 0, 0, "", #PB_Window_Invisible)
AddSysTrayIcon(#SysTrayIcon, WindowID(#Window), ImageID(CatchImage(#PB_Any, ?icon)))
CreatePopupMenu(#Menu)
MenuItem(#MenuItem_Quit, "Beenden")
MenuItem(#MenuItem_Factor, "Breite des Hauptbildschirms")
AddWindowTimer(#Window, #Timer, 10000)

If OpenPreferences(GetEnvironmentVariable("APPDATA")+"\Mauswegmesser.ini")
	Factor = ReadPreferenceDouble("Factor", 0.0)
	Length = ReadPreferenceDouble("Length", 0.0)
Else
	Zoll = ValD(InputRequester("Einstellungen", "Bildschirmdiagonale in Zoll:", "20.0"))
	Factor = Zoll * 0.0254 / Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0))
	WritePreferenceDouble("Factor", Factor)
	WritePreferenceDouble("Length", 0.0)
EndIf
ClosePreferences()

OldX = DesktopMouseX()
OldY = DesktopMouseY()

Repeat
	Select WaitWindowEvent(50)
		Case #PB_Event_CloseWindow
			SaveConfiguration()
			End
		Case #PB_Event_SysTray
			DisplayPopupMenu(#Menu, WindowID(#Window))
		Case #PB_Event_Menu
			Select EventMenu()
				Case #MenuItem_Factor
					Zoll = Factor * Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0)) / 0.0254
					Zoll = ValD(InputRequester("Einstellungen", "Bildschirmdiagonale in Zoll:", StrD(Zoll)))
					Factor = Zoll * 0.0254 / Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0))
					SaveConfiguration()
				Case #MenuItem_Quit
					SaveConfiguration()
					End
			EndSelect
			
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer
					SaveConfiguration()
			EndSelect
	EndSelect
	X = DesktopMouseX()
	Y = DesktopMouseY()
	Length + Sqr((X-OldX)*(X-OldX)+(Y-OldY)*(Y-OldY)) * Factor
	OldX = X
	OldY = Y
	ToolTip = "Zurückgelegter Weg der Maus: "
	If Length < 1000
		ToolTip + StrD(Length, 1)+"m"
	Else
		ToolTip + StrD(Length/1000, 2)+"km"
	EndIf
	SysTrayIconToolTip(#SysTrayIcon, ToolTip)
ForEver

DataSection
	icon:
	Data.q $0A1A0A0D474E5089,$524448490D000000,$1000000010000000,$FFF31F0000000608,$4752730100000061
	Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
	Data.q $000000189C9A0001,$0BDC07454D497407,$2993D6D90325170A,$5441444953020000,$4154485D939DCB38
	Data.q $1229AE3FB39F8618,$12912617526614A8,$15AD145D17916B82,$758191112620A51A,$DD64991524A60419
	Data.q $5EB9BB222596FE15,$56199652D4681269,$4D9D96BA9A3F460A,$A667BB8F7574C509,$9BE6E7228309558B
	Data.q $00FDE19DE67978F9,$0065CAB3F4686FA8,$B79768D0D4DD75D0,$FBF7E00AAEC5EEEB,$58C4444441999439
	Data.q $020407FFDC9DCD55,$A27481E0E1AD8584,$958EB5D5951CA3A3,$6D22755EB46BF4C2,$6F81742003FF19D7
	Data.q $5EDB74947BB71E7E,$1AA8AADEE7C7C4B6,$D7662B4ECCC8C15B,$9A6A5DE9CAD9D666,$B33302DA68948400
	Data.q $A44A4A488706065E,$04291CADAC62E475,$9C97D9420B141908,$BDA38E52B27B4607,$D05B40A40026A390
	Data.q $0F1E3C4A419884B0,$B4C3505BB93B269F,$C18022E80D2910F6,$2729FD9DB8FF4910,$0730370D73EB9830
	Data.q $42425869A681081D,$7C3F094828A28090,$90837E596EE579EF,$864F513FD0CC500F,$0026D9758FAE9F35
	Data.q $99434258FCD34129,$02830A3232249A9A,$D1264B2D6587793F,$1D7F5B423462D317,$021081FF2C9E5981
	Data.q $59391F5F6DE09D55,$31E1ACA76E37AC59,$123BC814502F0452,$AE1D2769E0C7BBDC,$9B9DE0B45818CE52
	Data.q $9D537CF09F6F4DE3,$824951DA9CA3A323,$11476B1E7EDBD67A,$F17855B838730056,$136181A729570192
	Data.q $7AEEE9AF3D3DE904,$8B8B8F6A6CECD05E,$0BE69F0F2C7E39CB,$E73C2A284D89898F,$BBBB0BF86CF2F058
	Data.q $646061C2547C99BA,$D2DAAAA82A520739,$1E1A1D7C0FBA6CEC,$54D4CECCFC181DAA,$7F90AEB803B75D74
	Data.q $0F807B31476B0D21,$BCEDFA6C0296832B,$936D696CB54566E1,$71B28B7F5C9725C5,$5B33FADFE9807AB1
	Data.q $2E9F1F7F8C2625B7,$A4CD5A98127CBD2B,$FD05FA25FFE2046E,$00021AB9B59204D8,$AE444E4549000000
	Data.q $0000000000826042
EndDataSection
Der Code kann natürlich noch ausgebaut werden und die Ergebnisse statistisch ausgewertet werden.
Ich hab das Ding inzwischen Laufen, und alleine um diesen Beitrag zu schreiben und den Code zu testen, hab ich schon 50m zurückgelegt ^^

Re: Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 12:31
von RSBasic
Joar, aber die Idee ist nicht neu: http://www.purebasic.fr/german/viewtopi ... 11&t=20306
Aber trotzdem tolle Sache: :allright:

Re: Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 15:50
von NicTheQuick
Leider sieht man unter Linux den Tooltip nicht.
Und wesentlich praktischer als die Angabe der Breite des Bildschirmes in Millimeter, wäre es die Diagonale in Zoll anzugeben. Denn die meisten Leute wissen, wie viel Zoll ihr Monitor hat. Und daraus und aus der Auflösung kannst du dann Breite und Höhe in Millimeter berechnen.

Falls du es einbauen willst, hier schonmal die Formel:

Code: Alles auswählen

resolutionX.i = 1680
resolutionY.i = 1050
diagonalZoll.d = 15.4

diagonalMm.d = diagonalZoll * 25.4
MmProPixel.d = Sqr((diagonalMm * diagonalMm) / ((resolutionX * resolutionX) + (resolutionY * resolutionY)))
width.d = resolutionX * MmProPixel
height.d = resolutionY * MmProPixel

Debug width
Debug height

Re: Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 16:15
von NicknameFJ
Hi Stargate,

coole Sache.

Aber die Zeilen in der auf den Timer reagiert wird (Zeilen 61 ff.)

müssen so lauten sonst funktioniert der Autosave alle 10 sec. nicht:

Code: Alles auswählen

     
 Case #PB_Event_Timer
   Select EventTimer()
     Case #Timer
       SaveConfiguration()
   EndSelect

NicknameFJ

Re: Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 16:34
von STARGÅTE
So, Code ist aktualisiert (danke NicknameFJ und NicTheQuick)

@RSBasic: Mist ^^

Re: Witzige Idee - Mauswegmesser

Verfasst: 11.11.2012 17:09
von NicTheQuick
Okay, noch drei Fehler.
  1. Im Contextmenü des Systray-Icons heißt es immer noch "Bildschirmbreite".
  2. Die ini-Datei heißt unter Linux "\Mauswegmesser.ini". Schöner wäre es, wenn sie ".mauswegmesser" oder ähnliches heißen würde. Vor allem ohne den Backslash.
  3. Der Tooltip geht unter Linux immer noch nicht. Vielleicht fällt dir noch eine andere Möglichkeit ein die aktuelle Entfernung auszugeben. Möglicherweise ist das auch ein Bug von PB.
///Edit:
Hab den Code mal selbst berichtigt:

///Edit 2:
Hatte noch einen Fehler drin.

Code: Alles auswählen

Enumeration
	#Window
	#SysTrayIcon
	#Menu
	#MenuItem_Quit
	#MenuItem_Factor
	#Timer
EndEnumeration

Global Length.d, Factor.d, Time.d

Procedure SaveConfiguration()
	CompilerIf #PB_Compiler_OS = #PB_OS_Linux
		OpenPreferences(GetEnvironmentVariable("HOME") + "/.mauswegmesser")
	CompilerElse
		OpenPreferences(GetEnvironmentVariable("APPDATA") + "\Mauswegmesser.ini")
	CompilerEndIf
	WritePreferenceDouble("Factor", Factor)
	WritePreferenceDouble("Length", Length)
	ClosePreferences()
EndProcedure

Define OldX.i, OldY.i, X.i, Y.i, ToolTip.s, Zoll.d

UsePNGImageDecoder()
ExamineDesktops()

OpenWindow(#Window, 0, 0, 0, 0, "", #PB_Window_Invisible)
AddSysTrayIcon(#SysTrayIcon, WindowID(#Window), ImageID(CatchImage(#PB_Any, ?icon)))
CreatePopupMenu(#Menu)
MenuItem(#MenuItem_Quit, "Beenden")
MenuItem(#MenuItem_Factor, "Bildschirmdiagonale in Zoll")
AddWindowTimer(#Window, #Timer, 10000)

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
	If OpenPreferences(GetEnvironmentVariable("HOME") + "/.mauswegmesser")
CompilerElse
	If OpenPreferences(GetEnvironmentVariable("APPDATA") + "\Mauswegmesser.ini")
CompilerEndIf
	Factor = ReadPreferenceDouble("Factor", 0.0)
	Length = ReadPreferenceDouble("Length", 0.0)
Else
	Zoll = ValD(InputRequester("Einstellungen", "Bildschirmdiagonale in Zoll:", "20.0"))
	Factor = Zoll * 0.0254 / Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0))
	WritePreferenceDouble("Factor", Factor)
	WritePreferenceDouble("Length", 0.0)
EndIf
ClosePreferences()

OldX = DesktopMouseX()
OldY = DesktopMouseY()

Repeat
	Select WaitWindowEvent(50)
		Case #PB_Event_CloseWindow
			SaveConfiguration()
			End
		Case #PB_Event_SysTray
			DisplayPopupMenu(#Menu, WindowID(#Window))
		Case #PB_Event_Menu
			Select EventMenu()
				Case #MenuItem_Factor
					Zoll = Factor * Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0)) / 0.0254
					Zoll = ValD(InputRequester("Einstellungen", "Bildschirmdiagonale in Zoll:", StrD(Zoll)))
					Factor = Zoll * 0.0254 / Sqr(DesktopWidth(0)*DesktopWidth(0)+DesktopHeight(0)*DesktopHeight(0))
					SaveConfiguration()
				Case #MenuItem_Quit
					SaveConfiguration()
					End
			EndSelect
			
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer
					SaveConfiguration()
			EndSelect
	EndSelect
	X = DesktopMouseX()
	Y = DesktopMouseY()
	Length + Sqr((X-OldX)*(X-OldX)+(Y-OldY)*(Y-OldY)) * Factor
	If (OldX <> X Or OldY <> Y)
		ToolTip = "Zurückgelegter Weg der Maus: "
		If Length < 1000
			ToolTip + StrD(Length, 1)+"m"
		Else
			ToolTip + StrD(Length/1000, 2)+"km"
		EndIf
		SysTrayIconToolTip(#SysTrayIcon, ToolTip)
	EndIf
	OldX = X
	OldY = Y
ForEver

DataSection
	icon:
	Data.q $0A1A0A0D474E5089,$524448490D000000,$1000000010000000,$FFF31F0000000608,$4752730100000061
	Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$130B0000130B0000
	Data.q $000000189C9A0001,$0BDC07454D497407,$2993D6D90325170A,$5441444953020000,$4154485D939DCB38
	Data.q $1229AE3FB39F8618,$12912617526614A8,$15AD145D17916B82,$758191112620A51A,$DD64991524A60419
	Data.q $5EB9BB222596FE15,$56199652D4681269,$4D9D96BA9A3F460A,$A667BB8F7574C509,$9BE6E7228309558B
	Data.q $00FDE19DE67978F9,$0065CAB3F4686FA8,$B79768D0D4DD75D0,$FBF7E00AAEC5EEEB,$58C4444441999439
	Data.q $020407FFDC9DCD55,$A27481E0E1AD8584,$958EB5D5951CA3A3,$6D22755EB46BF4C2,$6F81742003FF19D7
	Data.q $5EDB74947BB71E7E,$1AA8AADEE7C7C4B6,$D7662B4ECCC8C15B,$9A6A5DE9CAD9D666,$B33302DA68948400
	Data.q $A44A4A488706065E,$04291CADAC62E475,$9C97D9420B141908,$BDA38E52B27B4607,$D05B40A40026A390
	Data.q $0F1E3C4A419884B0,$B4C3505BB93B269F,$C18022E80D2910F6,$2729FD9DB8FF4910,$0730370D73EB9830
	Data.q $42425869A681081D,$7C3F094828A28090,$90837E596EE579EF,$864F513FD0CC500F,$0026D9758FAE9F35
	Data.q $99434258FCD34129,$02830A3232249A9A,$D1264B2D6587793F,$1D7F5B423462D317,$021081FF2C9E5981
	Data.q $59391F5F6DE09D55,$31E1ACA76E37AC59,$123BC814502F0452,$AE1D2769E0C7BBDC,$9B9DE0B45818CE52
	Data.q $9D537CF09F6F4DE3,$824951DA9CA3A323,$11476B1E7EDBD67A,$F17855B838730056,$136181A729570192
	Data.q $7AEEE9AF3D3DE904,$8B8B8F6A6CECD05E,$0BE69F0F2C7E39CB,$E73C2A284D89898F,$BBBB0BF86CF2F058
	Data.q $646061C2547C99BA,$D2DAAAA82A520739,$1E1A1D7C0FBA6CEC,$54D4CECCFC181DAA,$7F90AEB803B75D74
	Data.q $0F807B31476B0D21,$BCEDFA6C0296832B,$936D696CB54566E1,$71B28B7F5C9725C5,$5B33FADFE9807AB1
	Data.q $2E9F1F7F8C2625B7,$A4CD5A98127CBD2B,$FD05FA25FFE2046E,$00021AB9B59204D8,$AE444E4549000000
	Data.q $0000000000826042
EndDataSection
Auch wichtig zu wissen ist, dass es unter Linux kein "APPDATA" gibt, sondern lediglich "HOME".
Außerdem habe ich herausgefunden, dass ich den Systray-Tooltip deswegen nicht gesehen habe, weil er alle 50 ms aktualisiert wurde, selbst wenn der Text sich eigentlich nicht geändert hatte. Deswegen habe ich es jetzt so gemacht, dass der Tooltip nur geändert wird, wenn es auch einen neuen Wert gibt.