Form ausblenden wenn inaktiv

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von hans im glück.

    Form ausblenden wenn inaktiv

    Hallo,
    ich bin gerade wieder an einem Update für pasGen.
    Da bei unerlaubtem Zugriff auf den Rechner theoretisch die Kennwörter aus der Datenbank gelesen werden könnten, hab ich mir gedacht, die Anwendung nach einiger Zeit auszublenden Me.Visible = False beim Einblenden (wird über NotifyIcon geregelt frage ich wieder das Kennwort ab. So hätte ich dann einen höheren Schutz.
    Ich hab daher versucht im Form_LostFocus Ereignis einen Timer zu starten, der dann nach Intervall 5000 die Form ausblendet.
    Leider funktioniert es nicht, ich vermute weil auf der Form der zuletzt gedrückte Button den Focus hat...
    Ich könnte auch hergehen und den Timer einfach im Form_LOad und Form_Resize starten, aber dann würde sich die Form ja auch ausblenden, wenn gerade jemand innerhalb der Form arbeitet...
    Hättet Ihr einen Tip für mich, wie ich das regeln könnte?

    Danke Euch
    Grüße
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo Suchst Du user idle time
    @VB1963 war schneller ||
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Ihr...
    Vielen Dank für den Link... den hatte ich gestern auch schon angeschaut, aber blick da nicht wirklich durch. Ich denke dort gehtb es darum, ob der User überhaupt den PC nutzt oder nicht, richtig? ich möchte ja quasi nur apprüfen ob mein Programm benutzt wird, oder gerade nicht... wenn nicht, dann Visible = False, wenn ja, dann mach nix...

    Ich hab mir den Code auch schon umgewandelt und angepasst, aber blicken tu ich es trotzdem nicht :)
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    richtig?
    Korrekt.
    Suchen wir also Application Idle Time und finden dies.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany danke für den Link... aber der Code klappt bei mir überhaupt nicht... nachdem die Form gestartet hat, beendet sich das Programm... obwohl ich im Timer Event die Form auf Visible = False setze...

    Und bein dem anderen Code oben, das funktioniert soweit, aber eben nur dann wenn ich garnix am PC mache... ich muss mal schauen wie ich das auf die Applikation umbiegen kann...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    beendet sich das Programm
    Bei mir läuft das, allerdings ohne .Hide.
    Kannst Du mal das Projekt posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany hatte da wohl einen Fehler drinn. Hab selbst nochmal Tante Google nach Application IDLE gefragt und diesen Code gefunden: [url]http://stackoverflow.com/questions/8097421/determine-if-application-has-had-any-activity-vb-net[/url]

    Das funktioniert bestens... jetzt bau ich noch eine Checkbox in die Settings Form plus Trackbar um die Zeit auszuwählen, dann kann der User entscheiden ob ausgeblendet werden soll nach Zeit und nach welcher Zeit...

    Danke für die Tips und Infos...
    "Hier könnte Ihre Werbung stehen..."
    Hallo @ThuCommix
    die Form wird ausgeblendet nach Zeit wenn sie den Focus verloren hat, also wenn du in ein anderes Programm wechselst läuft der Timer los, bleibst du in meinem Programm, passiert nichts. Beim wieder einblenden wird das Masterpassword wieder abgefragt. Ich will damit verhindern, das man den Platz verlässt, der PC ist nicht gesperrt, dann kann man, solange mein Programm sichtbar ist die Kennwörter auslesen. Wenn es automatisch verschwindet geht das eben nur mit Masterpasswort. Es ist natürlich kein 100% schutz, aber es hilft. Würde man seinen Rechner jedesmal sperren wenn man den Platz verlässt, wäre das noch sicherer.
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    wäre das noch sicherer.
    Dann sollte es eine Arbeitsanweisung diesen Inhalts geben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany bei uns in der Firma gibt es die. Und eine Gruppenrichtlinie, die den PC nach 15 Minuten untätigkeit sperrt.
    aber hier geht es ja eher um den privaten PC. Bei uns in der Firma müsste mein Programm auch erstmal von der IT frei gegeben werden, bevor es installiert oder verwendet werden darf.(Gut, ist jetzt nicht das Problem, weil ich es selber frei geben müsste :) )
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    um den privaten PC
    Von wie vielen PCs reden wir hier?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Öhhm.. keine Ahnung... über was reden wir überhaupt :)
    Es geht mir ja darum, das mein Programm pasGen sich nach einer vorgegebenen Zeit ausblendet wenn der User nichts im Prtogramm tut. Das Programm ist ja ein Passwort Generator, der die generierten Passwörter verschlüßelt in einer DB speichert. damit nicht jemand fremdes in der Abwesenheit des Users an die Kennwörter kommt, muss beim Einblenden des Programms (Klick auf das NotifyIcon) wieder das Masterpasswort eingegeben werden. Grundsätzlich muss ich sagen, wenn jemand seinen PC verlässt und sensible Programme offen lässt ohne den PC zu sperren, ist das schon fahrlässig... ich glaube das hat die Diskussion angestoßen... Wer mein Programm installiert, sollte schon selbst darauf achten das niemand unbeaufsichtigt an den PC kann... ich wollte mit dem automatischen Ausblenden nach nichtbenutzung einfach nur den Komfort etwas erhöhen...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    wenn der User nichts im Prtogramm tut
    Du hast hier (mindestens) zwei Teilprobleme, die Du getrennt bearbeiten solltest.
    1. Wie stelle ich fest, dass mein Programm für die und die Zeit nicht bedient wurde?
      (Sollte gelöst sein.)
    2. Was muss ich tun, wenn mein Programm nicht bedient wurde?
      z.B. unsichtbar, Tray Icon, Passwortdialog ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany: ich hab (denke ich) beides gelöst. Also, beim Starten der Anwendung (nach Eingabe des Masterpasswort) wird im Form Load ein Timer gesetzt (Intervall ist My.Settings.frmAutoHideInt * 60000) in den Settings stehen die Minuten drinn, also zum Beispiel 5. der Timer wird gestartet. Im Application_Idle wird der Timer gestoppt und wieder gestartet... so wie ich es verstanden habe sorgt Application_Idle dafür festzustellen ob sich irgendwas im Programm getan hat (Mausklick, Tastendruck, Form aktiv usw.) wird im Programm nichts getan, läuft der Timer runter und wenn die Zeit abgelaufen ist wird das Programm mit Me.Visible = False ausgeblendet. Einblenden kann man das Programm dann über das NotifyIcon im System Tray... beim Einblenden wird erst wieder das Masterpasswort abgefragt und der Timer gestartet (sofern AutoHide in den Settings True ist).
    Ist das Vorgehen soweit korrekt?
    P.S. ich lade nachher das neue Update noch hoch, dann könnt ihr das testen :)
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    korrekt?
    Wenn die Umsetzung dieser Beschreibung entspricht: Ja.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habs so beschrieben wie ich es umgesetzt habe.... ich poste hier mal die relevanten stellen

    Form Load:

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. pasGenFunctions.LoadDataSet(DsPass)
    3. Me.Size = New Size(384, 182)
    4. bsPass.Sort = "DateCreated DESC"
    5. dgvTxtDateCreated.HeaderText = My.Resources.dgvHeaderDate
    6. dgvTxtInfo.HeaderText = My.Resources.dgvHeaderInfo
    7. btnClipboard.HeaderText = My.Resources.dgvHeaderClipborad
    8. btnClipboard.UseColumnTextForButtonValue = True
    9. GenerateToolTips()
    10. nudPWLength.Value = My.Settings.defPWLength
    11. niMain.Visible = True
    12. niMain.ShowBalloonTip(5)
    13. AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle
    14. If My.Settings.frmAutoHide Then
    15. tmrMain.Interval = My.Settings.frmAutoHideInt * 60000
    16. tmrMain.Start()
    17. End If
    18. End Sub

    Application_idle:

    VB.NET-Quellcode

    1. Private Sub Application_Idle(sender As Object, e As EventArgs)
    2. tmrMain.Stop()
    3. tmrMain.Start()
    4. End Sub

    Timer_Tick:

    VB.NET-Quellcode

    1. Private Sub tmrMain_Tick(sender As Object, e As EventArgs) Handles tmrMain.Tick
    2. Me.Visible = False
    3. End Sub

    NotifyIcon:

    VB.NET-Quellcode

    1. Private Sub niMain_MouseClick(sender As Object, e As MouseEventArgs) Handles niMain.MouseClick
    2. If e.Button = Windows.Forms.MouseButtons.Left Then
    3. Using logInForm As New frmLogin
    4. If logInForm.ShowDialog() = Windows.Forms.DialogResult.OK Then
    5. Me.Visible = True
    6. Me.Focus()
    7. If My.Settings.frmAutoHide Then
    8. tmrMain.Start()
    9. End If
    10. End If
    11. End Using
    12. End If
    13. End Sub


    im Form Closing wird der Timer gestoppt...
    Hab ich was vergessen?
    "Hier könnte Ihre Werbung stehen..."