113 votes

Comment puis-je déterminer par programmation si mon poste de travail est-il verrouillé?

Je suis en train d'écrire quelques productivité/paramètres des outils pour m'aider à contrôler mon attention tout au long de la journée. Récemment, j'ai remarqué que j'ai tendance à descendre la piste plus que d'habitude et de ressentir le besoin de se lever et aller pour des promenades/boissons/etc et je suis inquiet que je suis "perdre" trop de temps.

Depuis j'ai toujours verrouiller mon ordinateur quand je vais n'importe où, et j'ai débloquer dès que je suis de retour (même si je suis juste en train de lire à mon bureau, etc), je me demandais comment je peux déterminer, dans le code, combien de temps la machine est verrouillée.

J'écris ceci en C# si cela aide, mais je suis ouvert à d'autres idées.


J'aime le service windows idée (et l'ont accepté) pour des raisons de simplicité et de propreté, mais malheureusement je ne pense pas que cela fonctionnera pour moi dans ce cas particulier. J'ai voulu l'exécuter sur mon poste de travail à la tâche plutôt que de la maison (ou en plus de la maison, je suppose), mais il est verrouillé assez difficile de courtoisie de la DoD. C'est en partie la raison pour laquelle je vais rouler mes propre, en fait.

Je vais l'écrire quand même et voir si cela fonctionne. Merci à tous!

146voto

Timothy Carter Points 7079

Je n'avais pas trouvé cela avant, mais à partir de toute application, vous pouvez accrocher un SessionSwitchEventHandler. Evidemment, votre application a besoin d'être en cours d'exécution, mais tant que c'est:

    Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);

    void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
    {
        if (e.Reason == SessionSwitchReason.SessionLock)
        { 
            //I left my desk
        }
        else if (e.Reason == SessionSwitchReason.SessionUnlock)
        { 
            //I returned to my desk
        }
    }

35voto

Timothy Carter Points 7079

Je voudrais créer un Service Windows (visual studio 2005 type de projet) qui gère le OnSessionChange événement comme indiqué ci-dessous:

    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        if (changeDescription.Reason == SessionChangeReason.SessionLock)
        { 
            //I left my desk
        }
        else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
        { 
            //I returned to my desk
        }
    }

Ce que et comment vous vous connectez à l'activité, à ce point est à vous, mais un Service Windows fournit un accès rapide et facile à des événements de windows comme le démarrage, l'arrêt, le login/, ainsi que le verrouillage et le déverrouillage des événements.

18voto

rwojtech Points 131

Je viens de m'inscrire à ce post (ne peut pas downvote encore): Ne PAS utiliser le sale hack suggéré par dan_g qui a actuellement 5 upvotes. Tenter de faire un switch de bureau afin de savoir si le bureau est verrouillé est horrible comportement. Pourquoi, vous demandez-vous? Parce qu'il VA réellement passer du bureau si vous utilisez un multi solution de bureau (pas de postes de travail virtuels) ou si vous utilisez des outils comme SuRun. Une explication plus détaillée (traduction google) peut être trouvé ici: 1

18voto

adeel825 Points 1511

La solution ci-dessous utilise l'API Win32. OnSessionLock est appelée lorsque le poste est verrouillé, et OnSessionUnlock est appelée lorsqu'il est déverrouillé.

[DllImport("wtsapi32.dll")]
private static extern bool WTSRegisterSessionNotification(IntPtr hWnd,
int dwFlags);

[DllImport("wtsapi32.dll")]
private static extern bool WTSUnRegisterSessionNotification(IntPtr
hWnd);

private const int NotifyForThisSession = 0; // This session only

private const int SessionChangeMessage = 0x02B1;
private const int SessionLockParam = 0x7;
private const int SessionUnlockParam = 0x8;

protected override void WndProc(ref Message m)
{
    // check for session change notifications
    if (m.Msg == SessionChangeMessage)
    {
        if (m.WParam.ToInt32() == SessionLockParam)
            OnSessionLock(); // Do something when locked
        else if (m.WParam.ToInt32() == SessionUnlockParam)
            OnSessionUnlock(); // Do something when unlocked
    }

    base.WndProc(ref m);
    return;
}

void OnSessionLock() 
{
    Debug.WriteLine("Locked...");
}

void OnSessionUnlock() 
{
    Debug.WriteLine("Unlocked...");
}

private void Form1Load(object sender, EventArgs e)
{
    WTSRegisterSessionNotification(this.Handle, NotifyForThisSession);
}

// and then when we are done, we should unregister for the notification
//  WTSUnRegisterSessionNotification(this.Handle);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X