Speichern von Daten beim Abmelden, Herunterfahre von Windows

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Speichern von Daten beim Abmelden, Herunterfahre von Windows

Beitrag von Pelagio »

Hallo :lamer:

Ich wollte versuchen, ein Programm zu schreiben welches mir sagt wer, wann, wie lange am Rechner tätig war. Diesbezüglich habe ich ein Programm geschrieben welches mir sagen kann wann jemand am Computer war aber leider nicht wie lange. Irgenwie Funktioniert mein
WindowCallBack nicht welches die Daten beim Abmelden Speichern soll.
Warum ?

Code: Alles auswählen

; PCRun
;~~~~~~~
Enumeration ;Fenster
   #Window_0
EndEnumeration

Enumeration ;Gadget
   #SYSTRAY
   #IMAGEVIEW
EndEnumeration

#TRUE  = 1
#FALSE = 0
#BASEFILENAME.s    = "PCRun" 
#SEPERATOR.s       = ";"
#DATAEXT.s         = ".dat"

NewList DS.s()
Global ProgramArt.b

Procedure DataWrite(Value.s)
   Protected Text.s, User.s
   Buffer.s = Space(1024) 
   bufsize.l = 1024 
   
   GetUserName_(@Buffer, @bufsize) 
   User = PeekS(Buffer,bufsize) 
   Text = User + #SEPERATOR + FormatDate("%dd.%mm.%yyyy", Date()) + #SEPERATOR + FormatDate("%hh.%ii", Date()) + #SEPERATOR + Value
   If  OpenFile(0, #BASEFILENAME + #DATAEXT)
      FileSeek(Lof())
      WriteStringN(Text)
      CloseFile(0)
   EndIf
EndProcedure

Procedure WindowsCallback(WindowID, Message, wParam, lParam)
   If (Message = #WM_QUERYENDSESSION): DataWrite("OFF"): EndIf
   ProcedureReturn #True 
EndProcedure 

Procedure Open_Window_Base()
   If OpenWindow(#Window_0, 0, 0, 0, 0,  #PB_Window_SystemMenu , "Computerlaufzeit")
      AddSysTrayIcon(#SYSTRAY, WindowID(), LoadImage(#IMAGEVIEW, "PBPCRun.ico"))
      HideWindow(#Window_0, #True)
   EndIf
EndProcedure

Open_Window_Base()
DataWrite("ON")
SetWindowCallback(@WindowsCallback())
Repeat
   baseEvent = WaitWindowEvent()
   Select baseEvent
      Case #PB_Event_CloseWindow
         baseQuit = #True
      Case  #PB_Event_SysTray
         If (EventType() = #PB_EventType_LeftDoubleClick)
            baseQuit = #True   
         EndIf
   EndSelect
Until(baseQuit = #True)

End
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

so gehts:

Code: Alles auswählen

; PCRun 
;~~~~~~~ 
Enumeration ;Fenster 
   #Window_0 
EndEnumeration 

Enumeration ;Gadget 
   #SYSTRAY 
   #IMAGEVIEW 
EndEnumeration 

#TRUE  = 1 
#FALSE = 0 
#BASEFILENAME.s    = "PCRun" 
#SEPERATOR.s       = ";" 
#DATAEXT.s         = ".dat" 

NewList DS.s() 
Global ProgramArt.b, baseQuit.b
baseQuit = #False

Procedure DataWrite(Value.s) 
   Protected Text.s, User.s 
   Buffer.s = Space(1024) 
   bufsize.l = 1024 
    
   GetUserName_(@Buffer, @bufsize) 
   User = PeekS(Buffer,bufsize) 
   Text = User + #SEPERATOR + FormatDate("%dd.%mm.%yyyy", Date()) + #SEPERATOR + FormatDate("%hh.%ii", Date()) + #SEPERATOR + Value 
   If  OpenFile(0, #BASEFILENAME + #DATAEXT) 
      FileSeek(Lof()) 
      WriteStringN(Text) 
      CloseFile(0) 
   EndIf 
EndProcedure 

Procedure WindowsCallback(WindowID, Message, wParam, lParam) 
   If (Message = #WM_QUERYENDSESSION)
    DataWrite("OFF")
    baseQuit = #True
    ProcedureReturn #True
   Else
    ProcedureReturn #PB_ProcessPureBasicEvents
   EndIf 
EndProcedure 

Procedure Open_Window_Base() 
   If OpenWindow(#Window_0, 0, 0, 0, 0,  #PB_Window_SystemMenu , "Computerlaufzeit") 
      AddSysTrayIcon(#SYSTRAY, WindowID(), LoadImage(#IMAGEVIEW, "c:\pavfn\exch\icon2.ico")) 
      HideWindow(#Window_0, #True) 
   EndIf 
EndProcedure 

Open_Window_Base() 
DataWrite("ON") 
SetWindowCallback(@WindowsCallback()) 
Repeat 
   baseEvent = WaitWindowEvent() 
   Select baseEvent 
      Case #PB_Event_CloseWindow 
         baseQuit = #True 
      Case  #PB_Event_SysTray 
         If (EventType() = #PB_EventType_LeftDoubleClick) 
            baseQuit = #True    
         EndIf 
   EndSelect 
   Delay(100)
Until(baseQuit = #True) 

End 
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

#PB_ProcessPureBasicEvents ist meinermeinung nach eine Konstante, die auf eine Adresse einer Funktion von PB verweist(irgendwie). Wenn also der Callback(deiner) Aufgerufen wird und DU die Message verarbeiten willst gibst du return zurück. Wenn nicht, dann sollte die PB Interne Funktion die Nachricht verarbeiten. Mit WinAPI hab ich das mit ProcedureReturn CallFunction(OldWndProc, hWnd, Msg, wParam, lParam) gesehen. OldWndProc ist dabei das ergebnis von GetWindowLong_(hWnd, #GWL_WNDPROC), also die vorherige Callbackfunktion.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

DarkDragon hat geschrieben:... gibst du return zurück ...
:lol: rekursive Rückgabe ... :lol:

Wenn die App ein höfliches #WM_QUERYENDSESSION kriegt, dann muss sie sich selbst beenden und #True zurückmelden, damit Windows weiss, dass sie sich beendet. Gibt sie #False zurück, wird der Logoff/Shutdown m.E. abgebrochen.
#PB_ProcessPureBasicEvents als Rückgabewert habe ich der Onlinehilfe und diversen Beispielen aus der Codebase entnommen, also kann es so falsch nicht nicht sein. Und es funktioniert.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Beitrag von Pelagio »

:allright:
Ich danke Allen die mir bei diesem Problem geholfen haben.
Ich habe die Anregungen aufgenomen und konnte so mein
Programm fertigstellen.
Das Problem war einzig und allein die Variable (baseQuit) die Global erstellt und in der CallBack Prozedure gefüllt werden musste.
Nochmals DANKE!!!
:D

Ich habe noch einmal eine generelle Frage:
Ich habe das Gefühl das die TRUE und FALSE Konstanten seid der neusten Version schon Vorhanden sind oder liegt dies an der jaPBe Oberfläche die ich jetzt benutze?
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

#True und #False warn doch schon immer vorhanden oder irr ich mich?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

125 hat geschrieben:#True und #False warn doch schon immer vorhanden oder irr ich mich?
Erst seit den PureTools soweit ich mich erinnere.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten