none
UWP Trigger für UserAway, LockScreen oder KeyDown RRS feed

  • Frage

  • Hallo zusammen,

    ich suche seit Tagen nach einer Möglichkeit in UWP mittels C# einen Trigger für Benutzeraktionen zu erstellen.

    Im Grunde geht es mir darum das eine Variabel (Zeitstempel) gesetzt wird wenn:
    • der User eine Taste drückt bzw. die Maus bewegt oder
    • der Benutzer den Computer sperrt bzw. abwesend (Energiesparmodus) ist.


    Zum letzen Punkt finde ich einiges im Netz dazu: UserAway, genau das was ich benötige.
    Problem: der UserPresent Trigger funktioniert ohne Probleme, der UserAway Trigger springt entweder gar nicht an, oder genau zur gleichen Sekunde, wenn ich die Maus wieder bewege. Beides nicht hilfreich da ich zur letzten Aktion eine Variabel setzen möchte. Anscheinend bin ich nicht der einzige mit diesem Problem.

    Dann gibt es noch eine Weitere Möglichkeit zu prüfen ob der Benutzer Authentifiziert ist, bringt mir allerdings nichts da der TimeTrigger nur alle 15 Minuten 1x ausgeführt wird. D.h. sehr ungenau.
    Einen eigenen Trigger den ich beim Launch starte führt auch wieder in eine Einbahnstraße durch den Lifecycle.

    Zum ersten Punkt, dort schaut es ähnlich bis schlechter aus.
    Die GetIdleTime Funktion existiert nicht.
    Einen Hook ala SetWindowsHookEx kann ich auch nicht setzen.
    Und sonst habe ich noch die Möglichkeit innerhalb meines Fensters Aktionen wahrzunehmen, z.b. KeyDown, hilft mir global nicht viel weiter.
    Dann gibt es noch DeviceUseTrigger via HID, aber wenn ich dort die Auslistung sehe klingt das sehr nach nicht möglich.

    Kennt jemand von euch eine Möglichkeit wie ich ermitteln kann ob der User noch anwesend ist?

    Vielen Dank schon mal für das Lesen.

    Viele Grüße
    • Bearbeitet A.Kuller Samstag, 27. Mai 2017 13:53
    Samstag, 27. Mai 2017 12:23

Antworten

  • Ein Ereignis wie Pause wirst Du nicht feststellen können, außer der User handelt so wie Du dir das vorstellst. Z.B Meldet sich vom System ab oder Fähr den PC in den Energiesparmodus. Es ist aber unwahrscheinlich der jeder User so vorgehen wird. Somit müsste der User nach deinen Vorgaben handeln. Demnach kannst Du auch auf die Oberfläche der App ein Start, Pause und Ende Button anlegen und dir die gesamte Prüfung sparen. Ist dem User die Zeiterfassung wichtig, wird er auf die Buttons klicken. Ist es nicht der fall, wird er machen was er will

    Um zu prüfen ob "away" gut funktioniert, solltest Du dir ein Text Log anlegen. 


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP



    Samstag, 27. Mai 2017 17:13

Alle Antworten

  • Hi A.,
    für die Bestimmung der An-/Abwesenheit wirst Du keine sinnvolle Lösung außer einem Totmannknopf finden, da je nach Anwendung Deckpausen von einigen Sekunden bis vielen Minuten möglich sein können und erst deren Überschreitung als Abwesenheit gewertet werden kann.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Samstag, 27. Mai 2017 14:46
  • Hallo A.Kuller,

    eine 100% Sicherheit wirst Du nicht erlangen können ob der User noch da ist oder nicht. Wenn Du Werte außerhalb der Sandbox für den User ermitteln willst, solltest Du auf WPF setzen.

    Mit den 3 Events kannst Du feststellen ob deine App im Vorder- oder Hintergrund ist.

    public App()
            {
                this.InitializeComponent();
                this.Suspending += OnSuspending;
                this.EnteredBackground += (s, e) => { };
                this.LeavingBackground += (s, e) => { };
    
                Window.Current.VisibilityChanged += (s, e) => { };
            }

    Zudem hast Du noch die Möglichkeit BackgroundTask nach entsprechender User Aktivität zu aktivieren. Ein Kriterium ist z.B. UserAway 


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Samstag, 27. Mai 2017 15:06
  • Hallo,

    danke für eure Antworten, der Benutzer ist aus meiner Definition abwesend wenn der Sperrbildschirm angezeigt wird. Die Genauigkeit kann gerne eine Differenz von 5 Minuten haben, das ist aber auch das Maximum.

    WPF wäre die letzte Lösung die ich nehmen würde wollen, die Anwendung soll auch auf Smartphones laufen und wäre somit doppelte Arbeit (jedoch ohne Prüfung auf Abwesenheit).

    UserAway wäre die perfekte Lösung, wenn es richtig funktionieren würde. Zu prüfen ob die Anwendung im Vorder- oder Hintergrund ist bringt auch nicht viel da es sich um eine Zeiterfassungsapp handelt und Größtenteils im Hintergrund läuft bis gesagt wird ich arbeite für ein anderes Projekt. Der Trigger soll Abwesenheiten feststellen (z.B. Pausen) und fragen ob er die bestehende Erfassung abbrechen soll oder weiterzählen soll.

    Ich bin nach dieser Anleitung vorgegangen, async benötige ich für das setzen dieser Variabel nicht (zum Test habe ich mir eine Meldung in die Debug Ausgabe schreiben lassen). Entweder springt away gar nicht an oder genau zu dem Moment wo present gefeuert wird. Kennt Ihr da eine Lösung?

    Viele Grüße

    A.Kuller

    Samstag, 27. Mai 2017 16:31
  • Ein Ereignis wie Pause wirst Du nicht feststellen können, außer der User handelt so wie Du dir das vorstellst. Z.B Meldet sich vom System ab oder Fähr den PC in den Energiesparmodus. Es ist aber unwahrscheinlich der jeder User so vorgehen wird. Somit müsste der User nach deinen Vorgaben handeln. Demnach kannst Du auch auf die Oberfläche der App ein Start, Pause und Ende Button anlegen und dir die gesamte Prüfung sparen. Ist dem User die Zeiterfassung wichtig, wird er auf die Buttons klicken. Ist es nicht der fall, wird er machen was er will

    Um zu prüfen ob "away" gut funktioniert, solltest Du dir ein Text Log anlegen. 


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP



    Samstag, 27. Mai 2017 17:13
  • Hallo Thomas,

    danke für deine Antwort. Ich habe mir eben ein neues Projekt angelegt und in diesem 2 Klassen für Away und Present angelegt. Beide produzieren Dateien mit entsprechenden Zeitstempel (unter anderem auch innerhalb von 2 Minuten). 

    In meinem Anwendungsfall sperrt der Benutzer immer seinen Bildschirm, so müsste es jetzt klappen.

    Vielen Dank noch mal.

    Viele Grüße

    A.Kuller


    • Bearbeitet A.Kuller Sonntag, 28. Mai 2017 15:55
    Sonntag, 28. Mai 2017 15:54