Fenster bei Inaktivität schließen



  • Meine Anwendung unterteilt sich in mehrere Fenster. Nun würde ich gerne eines davon - ein CFrameWnd - nach einer bstimmten Zeit der Inaktitität schließen.

    Grob gedacht habe ich mir das über einen "Sekunden-Timer" zu realisieren. Ich möchte allerdings ungerne jede mögliche Windowsnachricht in CFrameWnd behandeln (OnMouseMove, OnLButtonDown, etc.) und dort den Zähler zurücksetzen.

    Kennt jemand hier eine möglichst einfache und ressourcenschonende Lösung/Ansatz bzw. kann mir einen Tipp geben?

    lg
    Georg



  • Es gibt eine Methode OnIdle, die wird immer ausgeführt, wenn nichts passiert. Vielleicht ist das das Richtige für dich.


  • Mod



  • Super, GetLastInputInfo sieht sehr gut aus.
    Nun allerdings noch eine kleine Frage. Das CFrameWnd window kann natürlich auch modale child Dialoge geöfnet haben. In dieser Zeit sollte der Countdown aussetzen. Gibt es eine Funktion, die prüft ob gerader ein child dialog geöffnet ist?

    lg
    Georg



  • Hilft mit CWnd::IsWindowEnabled hier weiter?

    lg
    Georg


  • Mod

    Bist Du Dir sicher das GetLastInputInfo genügt. Es ist die letzte Eingabe in dieser Session. Nicht für diesen Prozess.



  • Martin Richter schrieb:

    Bist Du Dir sicher das GetLastInputInfo genügt. Es ist die letzte Eingabe in dieser Session. Nicht für diesen Prozess.

    Jetzt nicht mehr. 😕
    Was heißt in dieser Session? Ich dachte das gilt für "dieses Fenster".

    Georg


  • Mod

    Nö. Das gilt für die Terminal-Session. Also für den eingeloggten User.
    In dem Link ist aber auch eine Hook-Lösung für den aktuellen Prozess.

    PS: Hab ich es mir doch gedacht... 😃



  • Martin Richter schrieb:

    Nö. Das gilt für die Terminal-Session. Also für den eingeloggten User. In dem Link ist aber auch eine Hook-Lösung für den aktuellen Prozess.

    Das sollte in meinem Fall auch reichen, da i.d.R. nur der aktuelle aktive/angemeldete User das Programm nutzt.

    Martin Richter schrieb:

    PS: Hab ich es mir doch gedacht... 😃

    Wenn's ums Lesen geht, dann stimmt das nur zum Teil. 😃
    Überflogen habe ich den gesamten Artikel und die Hook-Lösung eher als workaround für Win98 System angehsehen.

    lg
    Georg


  • Mod

    Der liebe Paul DiLascia hat an dieser Stelle evtl. auch nicht genau gelesen was GetLastInputInfo macht 😉

    Den Hook benötigst Du aber in jedem Falle nicht systemweit, sondern einfach nur für Deinen Prozess! Wichtig!



  • Martin Richter schrieb:

    Der liebe Paul DiLascia hat an dieser Stelle evtl. auch nicht genau gelesen was GetLastInputInfo macht 😉

    Den Hook benötigst Du aber in jedem Falle nicht systemweit, sondern einfach nur für Deinen Prozess! Wichtig!

    Auszug aus der MSDN:

    MSDN Author schrieb:

    [...]GetLastInputInfo provides session-specific user input information for only the session that invoked the function[...]

    Sessions innerhalb eines Prozesses "kenne ich nicht". Schätze es geht um eine User session. Also user logged sich ein/aus etc. Das reicht für meinen Zweck eigentlich.

    Ich muss die inaktive Zeit während das Programm aktiv ist und der/ein user mit/ unter anderem Konto weiterarbeitet nicht prüfen, da das Fenster beim Beenden einer Session sowieso geschlossen wird. Demnach bräuchte ich den Hook doch nicht.

    lg
    Georg


Anmelden zum Antworten