BiPa-Timer zum Einhalten von Bildschirmpausen

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

BiPa-Timer zum Einhalten von Bildschirmpausen

Post by aifritz » 02 May 2020, 04:01

Hallo Zusammen,

in Zeiten von vermehrter Homeofficearbeit und eventuell damit verbundener Selbstausbeutung und Mißachtung der Gesundheit, dachte ich mir, wäre ein Bildschirmpausen-Timer genau das richtige :crazy:

Daher hier ein kleines Skript, welches einen an die nötigen Pausen erinnern möchte...
Viel Spaß damit und haltet durch! ;)

Code: Select all

; erstellt: 02.05.2020
; von     : aifritz
; Name    : BiPa-Timer
; ab ahk Version [v1.1.31+]
;
; Beschreibung:  
; =====================================
; Der Bildschirmpausen-Timer zeigt nach Ablauf der eingestellten Arbeitszeit einen Hinweis im Tray-Tip an und es ertönt ein kurzer Klang 
; falls ununterbrochen am Computer gearbeitet wurde. 
; Über das Einstellungs-Menü lassen sich: 
; - die Arbeitzeit bis zur nächsten Pause
; - die Pausenlänge
; - und eine Erinnerungszeit einstellen, falls die Pause vergessen wurde
; Hält man den Mauszeiger über das Systemtray-Icon wird die Zeit bis zur nächsten Pause, bzw. wie lang die Pause überfällig ist, angezeigt. 
; Will man eine Pause überspringen wählt man im Systemmenü Neustart. 
;======================================
;Update: 22.11.2020:
;auf Anregung von daywalker
;- Focus auf Edit1 in den Einstellungen setzen
;- Links in den Einstellungen erweitert

#InstallMouseHook      
#SingleInstance force 

Ver := 1.03
OnMessage(0x404, "AHK_NOTIFYICON") ;um Anzeigehinweis TrayTip ggf. auszublenden

;menu, tray, icon, MyPause.ico, 1 ;Statt des Autohotkey Standard Icon lässt sich hier ein eigenes Icon einstellen 
Menu, Tray, NoStandard ;kein Standard Menu
Menu, Tray, Add , BiPa-Timer &beenden, Beenden
Menu, Tray, Add , &Einstellungen, Einstellungen
Menu, Tray, Add , &Neustart/Pause überspringen, Neustart

IniFile := RegExReplace(A_ScriptFullPath,"(\.exe$)|(\.ahk$)",".ini") ;Ini Datei im aktuellen Verzeichnis
Vars = WorkTime,Pausendauer,Erinnerung
Loop Parse, Vars, `,   ;Lese die Werte aus ini Datei ein, falls vorhanden
{
   IniRead %A_LoopField%, %IniFile%, Zeiten, %A_LoopField%
     %A_LoopField% *= 60000 ;1 Minute = 60*1000 ms
}

JetztPause := false ;Boolean der auf true steht, wenn Pause
If (WorkTime = 0) ;falls noch keine Ini-Datei existiert, erst mal die Grundeinstellung anzeigen
  {
    WorkTime = 60
    Pausendauer = 10
    Erinnerung = 3
    Loop Parse, Vars, `,
      {
        IniWrite % %A_LoopField%, %IniFile%, Zeiten, %A_LoopField%
          %A_LoopField% *= 60000
      }
    Gosub Einstellungen
  }
;msgbox,4096,, Pausendauer|%Pausendauer%|`nWorkTime|%WorkTime%|`nErinnerung|%Erinnerung%|

SetTimer TimeCheck, 1000
WorkStart := A_Tickcount
ErinnerungStart := 0  ; merkt sich die aktuelle letzte Erinnerungszeit, um nach Ablauf der Erinnerung erneut zu warnen
ErinnerungStartFirst := 0 ;merkt sich die erste Erinnerungszeit

TimeCheck:
;Tooltip % A_Tickcount " `n" A_TimeIdlePhysical "`nPausendauer:" Pausendauer "`nWorkStart: " WorkStart "`nWorktime: " Worktime "`nErinnerung:" Erinnerung "`nErinnerungstart: " ErinnerungStart

If !JetztPause ;wenn noch keine Pause fällig
  {
  If (Round((Worktime - (A_Tickcount - Workstart))/60000, 1) < 1) ;wenn weniger als eine Minute, dann in Sek. anzeigen
    Menu, Tray, Tip , % "Nächste Bildschirmpause in " Round((Worktime - (A_Tickcount - Workstart))/60000*60, 0) " Sek."
  else
    Menu, Tray, Tip , % "Nächste Bildschirmpause in " Round((Worktime - (A_Tickcount - Workstart))/60000, 0) " Min."
  }
else ;wenn Pause fällig
  {
    If (Round((A_Tickcount - ErinnerungStartFirst)/60000, 0) <= 1) ;wenn weniger als eine Minute keine Pause
      Menu, Tray, Tip , % "Eine kleine Pause fällig!"
    else
      Menu, Tray, Tip , % "Kleine Pause fällig seit " Round((A_Tickcount - ErinnerungStartFirst)/60000, 0) " Min."  ;"->" (A_Tickcount - ErinnerungStart)/60000
  }
If (A_TimeIdlePhysical > Pausendauer) ;wenn ausgeruht
   { 
     WorkStart := A_Tickcount  ;Wenn nicht gearbeitet wurde, also Pause genommen, dann: reset Workstart
     If (JetztPause)
       {
         ErinnerungStart := 0
         ErinnerungStartFirst := 0
         JetztPause := false    ;Pause erledigt
         TrayTip, , % "Prima " Round(Pausendauer/60000, 0) " Min. Pause gemacht!" , 30, 1
       }
     Return
   }
If (A_Tickcount > WorkStart + Worktime) ;Pause ist fällig
  {  
    If (!JetztPause)
      {             ;Wenn noch kein Pausenvorschlag erfolgt ist, dies nun tun
        JetztPause := true
        TrayTip, , Wie wär's mit einer kleinen Pause?, 30, 1
        ErinnerungStart := A_Tickcount         ;Aktuelle Erinnerung start time
        ErinnerungStartFirst := A_Tickcount    ;Erste Erinnerung start time
        Return
      }
    If (A_Tickcount > ErinnerungStart + Erinnerung)
      { ;Bereits an Pause erinnert, aber immer noch am Arbeiten
        TrayTip, Erinnerung..., % "Kleine Pause fällig seit " Round((A_Tickcount - ErinnerungStartFirst)/60000, 0) " Min." , 30, 2
        ErinnerungStart := A_Tickcount         ; Reset für nächsten Hinweis
        Return
      }
  }
return

;die GUI für die Einstellungen
Einstellungen:
   Gui, Destroy
   Gui, +AlwaysOnTop
   Gui +Lastfound      
   GuiHWND := WinExist()   ;*the unique ID number (HWND/handle) of a window
   Gui Add, Text,x3 ,Der Bildschirm-Pausentimer kann dabei helfen, regelmäßige Bildschirmpausen einzuhalten.
   Gui Add, Text,x3 ,Nach Ablauf der Arbeitszeit erfolgt ein dezenter Hinweis am unteren rechten Bildschirmrand`nsowie ein kurzer Klang.
   Gui, Font, underline
   ;Gui, Add, Text, x3 y+5 cBlue gMyLink, Hier ein Link zum Thema Telearbeit: Arbeit im Büro gesund gestalten
   Gui, Add, Link,x3 y+10 gMyLink, <a id="1">Hier ein Link zum Thema Arbeit im Büro gesund gestalten</a>
   Gui, Add, Link,x3 y+10 gMyLink, <a id="2">- Signale des Körpers ernst nehmen</a>
   Gui, Add, Link,x3 y+10 gMyLink, <a id="3">- Übungen zur Entspannung der Augen</a>
   Gui, Font, norm
   Gui Add, Text, x3 y+20,- Den größten Effekt für die Gesundheit und die Leistungsfähigkeit haben Kurzpausen von`n  ca. 10 Minuten pro Stunde.`n- Länger als 2 Stunden sollten Sie keinesfalls ununterbrochen vor dem Bildschirm sitzen. 
   Gui Add, Text, x3 y+20, Alle Angaben in Minuten 

   field("WorkTime","Arbeitszeit bis zur nächsten Pause")
   field("Pausendauer","Bildschirm-Pausenzeit")
   field("Erinnerung","Erinnerung nach X Min., falls Pause vergessen")
   Gui Add, Button, x10 y+20 w134 Default, &Neustart
   Gui Add, Button, x+10 w134 gWeiter, &Fenster schließen
   Gui Add, Button, x+10 w134 gBeenden, &App beenden
   GuiControl, Focus, Edit1
   SendMessage, 0x00B1, 0, -1, Edit1 ; EM_SETSEL
   Gui Show,,Bildschirm-Pausentimer by aifritz  V%Ver%
   WinWaitClose, ahk_id %GuiHWND%        ; Waiting for Gui to Close *siehe unter 1.
Return

field(var,text) {                          ; Edit + UpDown + Text
   Global
   Gui Font, s8, MS Sans Serif
   Gui Add, Edit, w50 x30 y+10
   Gui Add, UpDown, Range1-500 v%var%, % %var%//60000
   Gui Font, s11, MS Sans Serif
   Gui Add, Text, x+20, %text%
}


MyLink:
  Gui Destroy
  switch Errorlevel
  {
  case 1:
    Run, "https://www.ergo-online.de/"
  case 2:
    Run, "https://www.ergo-online.de/arbeitsorganisation/arbeitsformen/callcenter/artikel/telearbeit/signale-des-koerpers-ernst-nehmen"
  case 3:
    Run, "https://www.ergo-online.de/ergonomie-und-gesundheit/gesundheit-und-vorsorge/artikel/vorsorge-augen/uebungen-zur-entspannung-der-augen/"
  }
return

ButtonNeustart: ;Wenn über Gui Neustart, dann zusätzlich Werte in Ini-Datei speichern
  Gui Submit
  Loop Parse, Vars, `,
   {
     IniWrite % %A_LoopField%, %IniFile%, Zeiten, %A_LoopField%
       %A_LoopField% *= 60000
   }
Neustart:
  Menu Tray, NoIcon ;Traytip ausblenden
  Menu Tray, Icon ;Traytip ausblenden
  WorkStart := A_Tickcount ;Falls Neustart
  JetztPause := false
  SplashImage,, B1 FM14,, Pausentimer zurückgesetzt
  Sleep 1000
  SplashImage, Off
Return

Weiter:
GuiClose:
GuiEscape:  ;Close GUI
  Gui Destroy
Return

Beenden:
  ExitApp
return

AHK_NOTIFYICON(wParam, lParam) ; http://www.autohotkey.com/board/topic/62125-how-do-i-change-the-actions-of-clicking-the-tray-icon/?p=391707
 {
   if (lParam = 0x205) ; WM_RBUTTONUP
     {
      Menu Tray, NoIcon ;Traytip ausblenden
      Menu Tray, Icon ;Traytip ausblenden
       ;Menu, Tray, Show ;Menü anzeigen
       Return
     }
 }

Last edited by aifritz on 22 Nov 2020, 05:18, edited 1 time in total.

User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: BiPa-Timer zum Einhalten von Bildschirmpausen

Post by LuckyJoe » 02 May 2020, 07:37

Hi,

cool! Bisher habe ich immer das Programm "Stickies" dazu genutzt - self-made ist natürlich schöner. Danke schön. :-)
Herzliche Grüße aus dem Rheinland
Lucky Joe

aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: BiPa-Timer zum Einhalten von Bildschirmpausen

Post by aifritz » 22 Nov 2020, 05:20

Auf Anregung von daywalker, ein paar Anpassungen:
- Focus wird auf Edit1 in den Einstellungen gesetzt
- Links in den Einstellungen erweitert

Danke daywalker :)

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: BiPa-Timer zum Einhalten von Bildschirmpausen

Post by halweg » 23 Nov 2020, 04:53

Danke fürs Teilen!

Evtl. habe ich es übersehen, aber wäre es nicht sinnvoll, wenn man beim Hochzählen der Arbeitszeit die Idle-Zeiten (wenn > 3 Min) abziehen würde? Oder direkt ab 5 Minuten Idle eine Bildschirmpause automatisch anrechnen?

Oder sehe nur ich das so, weil ich nicht angestellt bin.... ;)

aifritz
Posts: 301
Joined: 29 Jul 2018, 11:30
Location: Germany

Re: BiPa-Timer zum Einhalten von Bildschirmpausen

Post by aifritz » 23 Nov 2020, 13:45

Hi halweg,

aktuell ist es so, dass die Pause "anerkannt" wird, wenn man länger als die Pausendauer nichts gemacht hat.

Code: Select all

If (A_TimeIdlePhysical > Pausendauer) ;wenn ausgeruht
   { 
     WorkStart := A_Tickcount  ;Wenn nicht gearbeitet wurde, also Pause genommen, dann: reset Workstart
   ...
   
 
Aber zögere nicht, den Code an die Bedürfnisse für Selbständige anzupassen :)

Post Reply

Return to “Skripte und Funktionen”