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.

    Was soll

    MichaHo schrieb:

    VB.NET-Quellcode

    1. Me.Focus()
    bewirken?
    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!
    jetzt wo du es ansprichst, weis ich auch warum es nicht funktioniert :)
    wenn das Programm über das NotifyIcon eingeblendet wird, startet ja die LoginForm um das Masterpasswort abzufragen. da die manchmal nicht den Focus hat, fängt man an zu tippen, und es tut sich aber nichts weil die Login Form den Focus nicht hat... daher wollte ich damit erreichen das die Form den Focus bekommt...

    Bekommt sie aber nicht, da Me.Focus() sich ja auch die Hauptform bezieht, die zu dem Zeitpunkt nicht eingeblendet ist....
    Müsste ich dann ändern auf loginForm.Focus...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    nicht eingeblendet
    Das eine ist das aktive Control innerhalb eines Fensters, das andere ist das aktive Fenster im System, gugst Du SetForegroundWindow.
    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!
    ich hänge mich hier an: ich habe das Problem, dass das IdleEvent ständig kommt (jede Sekunde) da vermutlich 3rd Party dlls (List & Label ....) Lizenzprüfung oder ähnlich abfahren.

    ​Des weiteren habe ich selbst auch noch einen anderen Timer der gelegentlich mal in der DB nach Änderungen schaut.

    ​wenn also die Aktivitäten der anderen timer oder dlls abgeschlossen sind kommt wieder das idle Event.

    ​Soweit mein Problem (denke ich zumindest).

    Nun habe ich zwei Fragen:
    ​Kann ich beim Debuggen irgendwie raus finden was in den DLLS passiert?
    ​Gibt es die Möglichkeit irgendwie zu filtern? egtl. interessieren mich nur die Events im meiner Klasse, also hier das MainFOrm.
    Gruß Hannes

    hans im glück schrieb:

    IdleEvent
    :?:
    Was soll das sein? Hab ich so noch nicht gehört.
    Wenn in DLLs Lizenzen / Dongles abgefragt werden, passiert das innerhalb der DLL und beim nächsten Funktionsaufruf kommt ne exception, falls der Dongle nicht (mehr) da ist.
    Was in den DLLs passiert, ist meistens topf siegrid, ggf. gibt es da lediglich einen .NET-Wrapper, der eine native DLL umschließt.
    Events kannst Du in der WndProc abfangen.
    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 schrieb:

    Was soll das sein? Hab ich so noch nicht gehört.


    es ging ja im obigen fred um das hier (zusammengefasst):

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle
    3. End Sub
    4. Private Sub Application_Idle(sender As Object, e As EventArgs)
    5. tmrMain.Stop()
    6. tmrMain.Start()
    7. End Sub



    ​bei mir wird nun die

    VB.NET-Quellcode

    1. ​Private Sub Application_Idle
    ständig ausgeführt da vermutlich die eingebundenen dlls aktiv sind
    Gruß Hannes
    Hi,
    das Idle bedeutet ja, das geprüft wird ob die Anwendung/Form benutzt wird oder nicht, wird sie benutzt, startet der Timer neu (gestoppt und gestartet), wie @RodFromGermany schon sagte, wird Code aus der DLL ja innerhalb der DLL ausgeführt. ES sei denn, die Dll ändert irgendwas innerhalb deines Forms, das könnte dann wieder das Idle Event auslösen...
    gibt es nicht das Direktfenster? Wird dort eventuell etwas angezeigt?
    "Hier könnte Ihre Werbung stehen..."

    hans im glück schrieb:

    ständig ausgeführt
    Nimm einfach den Inhalt aus dieser Prozedur raus, da passiert eben nix anderes, nur dass eben der Timer läuft.
    Einen Timer zu stoppen und sofort wieder zu starten ist eh Tinnef.
    Was passiert in der Timer_Tick-Prozedur?
    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 schrieb:

    hans im glück schrieb:

    ständig ausgeführt
    ist eh Tinnef.

    wie würde man es richtig machen? ALso eine Anwendung, die sich nach bestimmer Zeit der Nichtbenutzung automatisch beendet?
    "Hier könnte Ihre Werbung stehen..."
    mein ziel ist exakt das selbe wie das von @MichaHo


    Was passiert in der Timer_Tick-Prozedur?​

    ​im Timer_Tick wird das form ausgeblendet

    VB.NET-Quellcode

    1. ​me.visible = false


    über ein notify Icon wird das form dann wieder aufrufbar.


    Einen Timer zu stoppen und sofort wieder zu starten ist eh Tinnef.​

    ​der timer wird daher erst gestoppt und dann wieder gestartet, da nachdem die Inaktivität im form eintritt ja erst die zeit ablaufen soll bis das form schließt.


    gibt es nicht das Direktfenster? Wird dort eventuell etwas angezeigt? ​


    leider nein, da steht garnix drin.
    Gruß Hannes

    MichaHo schrieb:

    die sich nach bestimmer Zeit der Nichtbenutzung automatisch beendet
    OK.
    Da müsst Ihr nur die richtige Frage an Frau Google richten: .net application idle time.
    Stackoverflow sagt dies dazu.
    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 vielen Dank!!!

    habs so umgesetzt (für alle nachkommen):


    Message Interface dem Form hinzufügen

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Implements IMessageFilter


    Deklaration der nötigen Variablen:

    VB.NET-Quellcode

    1. Private _timer As Timer
    2. Private _wentIdle As DateTime
    3. Private _idleTicks As Integer


    im form load:

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_OnIdle
    3. Application.AddMessageFilter(Me)
    4. _timer = New Timer()
    5. AddHandler _timer.Tick, AddressOf Timer_Exipred
    6. _timer.Interval = 1000
    7. _timer.Start()
    8. end Sub


    Prozeduren :

    VB.NET-Quellcode

    1. Private Sub Application_OnIdle(sender As Object, e As EventArgs)
    2. ' keep track of the last time we went idle
    3. _wentIdle = DateTime.Now
    4. lblWentIdle.Text = DateTime.Now.ToString
    5. End Sub
    6. Private Sub Timer_Exipred(sender As Object, e As EventArgs)
    7. Dim diff As TimeSpan = DateTime.Now - _wentIdle
    8. ' see if we have been idle longer than our configured value
    9. 'If diff.TotalSeconds >= 10 Then '10 sec // ggfls durch My Settings Wert ersetzen
    10. ' MessageBox.Show("We Are IDLE! - " & _wentIdle.ToString)
    11. 'End If
    12. '* OR *
    13. ' see if we have gone idle based on our configured value
    14. If System.Threading.Interlocked.Increment(_idleTicks) >= 10 Then '10 sec // ggfls durch My Settings Wert ersetzen
    15. lblIdleTicks.Text = "We Are IDLE! - " & _idleTicks.ToString
    16. End If
    17. End Sub
    18. Private Function isUserInput(m As Message) As Boolean
    19. ' look for any message that was the result of user input
    20. If m.Msg = &H200 Then
    21. Return True
    22. End If
    23. ' WM_MOUSEMOVE
    24. If m.Msg = &H20A Then
    25. Return True
    26. End If
    27. ' WM_MOUSEWHEEL
    28. If m.Msg = &H100 Then
    29. Return True
    30. End If
    31. ' WM_KEYDOWN
    32. If m.Msg = &H101 Then
    33. Return True
    34. End If
    35. ' WM_KEYUP
    36. ' ... etc
    37. Return False
    38. End Function
    39. Private Function IMessageFilter_PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
    40. ' reset our last idle time if the message was user input
    41. If isUserInput(m) Then
    42. _wentIdle = DateTime.MaxValue
    43. _idleTicks = 0
    44. ' wir sind aktiv
    45. End If
    46. Return False
    47. End Function
    Gruß Hannes