Zum Inhalt springen

VB: automatisches Logout


Druid

Empfohlene Beiträge

Ich habe folgendes Problem:

Wenn das Programm 10 Minuten keine Benutzereingabe registriert soll es sich sperren und diese Sperre soll nur durch ein Passwort wieder aufgehoben werden können...(siehe Bildschirmschoner)

Es geht dabei um Datenschutz.. Sinn?? Weiß ich nicht, ob das einen Sinn hat, aber ich muss es trotzdem so machen *g*

Also.. Im Internet habe ich nichts dazu gefunden! Vielleicht kann mir ja einer von euch helfen!

MFG

Druid :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde einen globalen Timer deklarieren und dies dann immer bei Benutzereingaben (Siehe KeyPressevents oder so ) auf null setzen. Erreicht der Timer einen bestimmten Wert (bsp. 2 Minuten) schaltest du alles aus und aktiviert, den "Sicherungsmodus".

Wertprüfung kannst du ja mit dem Timer-Control von VB machen.

mfg

blear

P.S.: Bin übrigens auch ein nürnberger! :bimei

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo ist denn da das Problem? Du baust einen Timer ein und fängst Benutzereingaben ab. Jedesmal wenn der Benutzer eine Taste oder eine Maustaste drückt oder den Mauszeiger bewegt setzt du den Timer zurück. Wenn der Timer dann einen angegebenen Wert überschreitet sperrst du einfach die Fenster und die Funktionen (damit Tools wie TheCustomizer nicht einfach die Fenster bzw Buttons aktivieren). Programmieren musst du es schon selbst.

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

So dachte ich mir das schon auch!!

Aber ich bin noch nicht so bewandert in VB!

Wie erstelle ich einen Timer?

Wie fang ich Keyboard-Eingaben ab?

Wie fange ich Mouse-Bewegungen ab?

Wie sperre ich Fenster? Und wie Funktionen?

Viele Fragen... ich weiß *g*

MFG

Druid :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von BlearSun

Erreicht der Timer einen bestimmten Wert (bsp. 2 Minuten) schaltest du alles aus und aktiviert, den "Sicherungsmodus".

Wertprüfung kannst du ja mit dem Timer-Control von VB machen.

Das musst du genauer definieren..

Ich schalte alles aus?? Auch die Kaffee-Maschine?? Ne, Scherz beiseite! Was meinst du mit ausschalten?

Und was ist der Sicherungsmodus, bzw, wie aktiviere ich ihn??

MFG

Druid :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmm..nun

Mit ausschalten, war natürlich nicht gemeint, dass du irgendetwas ausschalten sollst! :bimei

Du kannst zum Beispiel einen Variablen von Typ Currency nehmen.

also so:

Die Variable muss Globlal definiert werden, damit das auch überall seine gültigkeit hat! Als Beispiel kannst du das in eine .bas file deklarieren!

Public Timer as Currency

so in etwa.

Nun ja, irgendwann muss du diesen Timer natürlich aktivieren! Am besten wahrscheinlich in Form_load event oder so.

siehe auch:

http://home.t-online.de/home/goetz-software/tips.htm#kb_hptimer

MfG

Blear

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Druid

So dachte ich mir das schon auch!!

Aber ich bin noch nicht so bewandert in VB!

Wie erstelle ich einen Timer?

Wie fang ich Keyboard-Eingaben ab?

Wie fange ich Mouse-Bewegungen ab?

Wie sperre ich Fenster? Und wie Funktionen?

Viele Fragen... ich weiß *g*

MFG

Druid :cool:

Hi !

Don´t Panik ! :)

Ein Timer ist ein Steuerelement, genau wie die Buttons & die Textfelder auch, allerdings für den User unsichtbar. Er gibt die immer die seit Mitternacht vergangen Sekunden als Double zurück. Das ist ziemlich praktisch, da du auf die Art immer den genauen Zeitpunkt kennst wann etwas geschehen ist.

Als erstes musst du den Timer an einem beliebigen Ort im Formular plazieren. Jetzt kannst du in im Quellcode mit dem Namen Timer1 ansprechen (Name frei wählbar). Dann nimmst du eine Variable von Typ Double und schreibst den Wert rein.

Variable = Timer.

Da die Variable den Wert nicht verändert kannst du sie wunderbar für einen Vergleich benutzen :

if Timer >= (Variable + 600) then

deine Anweisung zur Speerung

else

was anderes (oder nichts)

end if

Das ist eigentlich schon die Lösung für dein Problem, jetzt musst du nur dafür Sorgen dass du diese Prüfung immer im richten AUgenblick machst und da kannst du die Lösungen von oben benutzen, du must dann halt bei jedem Ereignis, sei es Click,Change, Load usw. prüfen ob die Differenz zwischen dem aktuellen Timer und der Variable größer 600 Sekunden ist.

Wenn dass so ist, dann nimm ein ein großes modales Formular mit schwarzen Hintergrund (möglichst maximiert) mit den Textfeldern für den Benutzeranmeldung und stell es in den Vordergrund, damit der User sich verifizieren muss. Tip : Jedes Formlar hat ein Ereignis wenn es geschlossen wird (Form_unload), dass Ereignis musst du abfangen damitder User nicht einfach auf dass "X" klicken kann und wieder im Programm ist.

Damit kannst du dir auch dass Abfangen von Tastatureingaben & Maus sparen. (Frage : Warum eigentlich ??? *wunder*)

Und noch ein Tip : Ich hab mal gesehen wie jemand eine Art Timer_Change Ereignis aufgerufen hat, ich weiß aber nicht mehr wie, glaube dass war eine API-Funktion. Kannst ja mal schauen ob es eine Art Timer_Change auch in VB gibt.

so long

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi !

Die Frage mit den der Maus & der Tastatur nehme ich zurück, da ist der Groschen erst ein bißchen später gefallen.

Vergiss was ich über das Click,CHange & Load Ereignis gesagt habe. Es ist viel besser die MouseMove & KeyPress- Ereignisse abzufangen.

Du findest diese in den beiden Leisten über dem Quellcode.

so long

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Feivel:

Das ist schon schön und gut, aber wir haben in unserem Programm ca. 400 Ereignisse, die aufgerufen werden können und da bei jedem Ereignis den Timer zu überprüfen wäre ein bisschen utopisch :)

Geht das nicht, dass der Timer im Hintergrund automatisch immer überprüft wird?

MFG

Druid :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Druid

@Feivel:

Das ist schon schön und gut, aber wir haben in unserem Programm ca. 400 Ereignisse, die aufgerufen werden können und da bei jedem Ereignis den Timer zu überprüfen wäre ein bisschen utopisch :)

Geht das nicht, dass der Timer im Hintergrund automatisch immer überprüft wird?

MFG

Druid :cool:

Hi Druid !

das weiß ich leider nicht, ich kann dir nur einen Link geben auf dem es mit API-Funktionen gemacht wird, aber wenn du noch nicht so fit bist dann wird dich das mehr verwirren als dir nützen.

Aber lernen wirst du es eh irgendwann müssen, also schau mal

hier unter Tips & Tricks/Timer & Datum/ und dann ganz unten.

Mit den Ereignissen hab ich mich ja schon selber verbessert, alle Ereignisse abzufangen wäre natürlich Quatsch, da hat BlearSun natürlich recht.

Das Problem ist einfach dass du immer wieder ein Ereignis erzeugen musst dass den Zustand des Timers prüft. Eine Endlosschleife mit DoEvents wäre eine Lösung, aber dass ist zu umständlich und du wirst die eher dass Programm zerschiessen als Erfolg zu haben.

Ich meld mich nochmal wenn mir was einfällt.

Bis denne

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist doch alles ganz einfach:

Erstelle eine Funktion z.B. UserInput() und eine Variable (z.B TimeStamp). Beides am besten globalen in einem Modul definieren. In dieser Variable (hier wäre es TimeStamp) wird ein TimeStamp der aktuellen Systemzeit gespeichert (z. B. mit der Timer-Funktion, nicht verwechseln mit dem Timer-Control!) wenn die Funktion UserInput aufgerufen wird. Du musst dann nur noch bei jeder möglichen Benutzereingabe die UserInput()-Funktion hinzufügen:

1. Bei Formularen in der MouseMove-Methode

2. Bei Buttons in der Click-Methode und (wenn es notwendig ist) in der MouseMove-Methode

3. Bei Textfeldern in der Change-Methode

Natürlich gibt es noch viele andere Controls mit einer Click- und MouseMove-Methode. Die musst du alle abfangen sonst kann es sein dass der Benutzer gerade etwas eingiebt oder verändert und er plötzlich im Regen steht.

Alles was du nun tun musst, ist folgendes:

Beim ersten Start weist du der TimeStamp-Variablen die aktuelle Zeit mit der Timer-Funktion zu. Jedesmal wenn die UserInput-Funktion aufgerufen wird, setzt sie den TimeStamp neu. Danach macht der Timer folgendes: Er vergleicht den aktuellen TimeStamp mit dem Ergebnis der Timer-Funktion, überprüft ob eine bestimmte Zeit überschritten wurde und sperrt gegebenenfalls die Fenster, Buttons, etc.

So... nun habe ich dir alles notwendige erzählt und jetzt liegt es an dir etwas vernünftiges daraus zu machen.

Es gibt sicher andere Möglichkeiten... aber leichter sind diese sicher auch nicht. Meine Methode funktioniert ganz ohne Windows-API-Funktionen.

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke.. aber ich hab es jetzt mit WinApi Funktionen gelöst!

Eine Frage nur noch: Wie kann ich überprüfen, ob eine Taste der Tastatur gedrückt wurde oder nicht?

Mit dem KeyPress-Ereigniss kann ich es ja nur überprüfen, wenn schon eine gedrückt wurde und ich möchte das Keyboard aber allgemein abprüfen und nicht nur auf eine Taste..

Also im Prinzip sowas wie:

IF Not Tastatureingabe then...

Versteht ihr?? Die Lösung und dann hab ich es komplett *freu*

MFG

Druid :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Executioner

Was ist TheCustomizer und wo finde ich den zum Ausprobieren?

"The Customiser" (mit s, statt z, sorry)

Das ist ein Tool mit dem man bei jedem beliebigen Fenster änderungen vornehmen kann. Allerdings nur während der Laufzeit des Programmes... die Einstellungen werden nicht gespeichert (aber dazu gibts den ResHacker).

Beides findest du mit einer Suchmaschine... allerdings hatte ich ewig nach dem Customiser gesucht. Also viel Geduld aufbringen.

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probiert mal folgendes:



' Die IdleTracker-DLL überwacht sowohl Tastatur- als auch Mauseingaben!


' Auslesen der Systemzeit

Private Declare Function GetTickCount Lib "kernel32" () As Long


' Überwachung der Benutzereingaben beginnen

Private Declare Function IdleTrackerInit Lib "IdleTrac" Alias "#2" () As Boolean


' Überwachung der Benutzereingaben beenden

Private Declare Sub IdleTrackerTerm Lib "IdleTrac" Alias "#3" ()


' Zeit der letzen Benutzereingabe ermitteln

Private Declare Function IdleTrackerGetLastTickCount Lib "IdleTrac" Alias "#1" () As Long


Dim IdleTrackerActive As Boolean


Private Sub Command1_Click()

  Timer1.Enabled = True

End Sub


Private Sub Form_Load()

    IdleTrackerActive = IdleTrackerInit

    If IdleTrackerActive Then

      Timer1.Enabled = True

      Timer1.Interval = 1

    Else

      MsgBox "Konnte IdleTracker nicht initialisieren!", vbCritical + vbOKOnly, "Fehler!"

    End If

End Sub


Private Sub Form_Unload(Cancel As Integer)

  If IdleTrackerActive = True Then

    IdleTrackerTerm

    MsgBox "IdleTracker wurde beendet", vbOKOnly

  End If

End Sub


Private Sub Timer1_Timer()

  Dim IdleTimeStamp As Long

  Dim CurrentTimeStamp As Long

  CurrentTimeStamp = GetTickCount / 1000

  IdleTimeStamp = IdleTrackerGetLastTickCount / 1000


  If (CurrentTimeStamp - IdleTimeStamp) >= 60 Then

    ' Hier sollte eigentlich das Programm gesperrt werden!

    MsgBox "60 Sekunden lang ist einfach nix passiert!", vbOKOnly

    Timer1.Enabled = False

  End If

End Sub

Natürlich braucht man dazu noch die IdleTracker-DLL! Einfach in das Windows-System-Verzeichnis kopieren. Dann müsste alles klappen. :)

Um das sperren der Fenster muss man sich aber noch selbst kümmern... meine Arbeit ist getan! ;)

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hatte ein "= True" im Quellcode, deswegen ging es bei mir nicht... sorry. Nachträglich kann man ja nix mehr editieren, echt ein spitzen Forum! :( Wegen den paar Zeichen werde ich garantiert nicht mit den Moderatoren in Verbindung treten. Sowas nennt sich normalerweise "bescheidener Service"!

So sollte die Funktion eigentlich sein:


Private Sub Form_Unload(Cancel As Integer)

  If IdleTrackerActive Then

    IdleTrackerTerm

    MsgBox "IdleTracker wurde beendet", vbOKOnly

  End If

End Sub

Ach ja, ins Windows-System-Verzeichnis muss man die DLL auch nicht unbedingt kopieren, es reicht wenn sie sich im gleichen Verzeichnis wie das Programm befindet. Das Programm sollte aber beim Start überprüfen ob die DLL auch vorhanden ist.

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...