Witzige Idee - Mauswegmesser

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Witzige Idee - Mauswegmesser

Beitrag 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 ^^
Zuletzt geändert von STARGÅTE am 11.11.2012 16:33, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Witzige Idee - Mauswegmesser

Beitrag von RSBasic »

Joar, aber die Idee ist nicht neu: http://www.purebasic.fr/german/viewtopi ... 11&t=20306
Aber trotzdem tolle Sache: :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Witzige Idee - Mauswegmesser

Beitrag 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
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Witzige Idee - Mauswegmesser

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Witzige Idee - Mauswegmesser

Beitrag von STARGÅTE »

So, Code ist aktualisiert (danke NicknameFJ und NicTheQuick)

@RSBasic: Mist ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Witzige Idee - Mauswegmesser

Beitrag 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.
Antworten