Seite 1 von 1

Speichern von Daten beim Abmelden, Herunterfahre von Windows

Verfasst: 28.12.2004 12:17
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

Verfasst: 29.12.2004 09:49
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 

Verfasst: 29.12.2004 10:03
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.

Verfasst: 29.12.2004 10:33
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.

Verfasst: 29.12.2004 12:04
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?

Verfasst: 29.12.2004 17:25
von 125
#True und #False warn doch schon immer vorhanden oder irr ich mich?

Verfasst: 29.12.2004 18:52
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.