Программно определите продолжительность заблокированной рабочей станции?

вы можете использовать

import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt

, если вы вообще не хотите использовать tkinter.

Также не забудьте использовать %matplotlib inline в верхней части вашего ноутбука, если с помощью одного.

EDIT: agg - другой бэкэнд, такой как tkinter для matplotlib.

110
задан 5377037 20 June 2019 в 12:25
поделиться

4 ответа

Я не нашел это прежде, но из любого приложения Вы можете сцепление SessionSwitchEventHandler. Очевидно, Ваше приложение должно будет работать, но пока это:

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
    }
}
134
ответ дан Termininja 24 November 2019 в 03:14
поделиться

Я создал бы службу Windows (тип проекта Visual Studio 2005 года), который обрабатывает событие OnSessionChange как показано ниже:

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
    }
}

то, Какой и как Вы регистрируете действие в той точке, ваше дело, но служба Windows обеспечивает быстрый и легкий доступ к событиям окон как запуск, завершение работы, вход в систему/, наряду с блокировкой, и разблокируйте события.

35
ответ дан Dan Atkinson 24 November 2019 в 03:14
поделиться

Решение ниже использует API Win32. OnSessionLock называют, когда рабочая станция заблокирована, и OnSessionUnlock называют, когда это разблокировано.

[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);
18
ответ дан adeel825 24 November 2019 в 03:14
поделиться

Ниже 100%, работающих код, чтобы найти, заблокирован ли ПК или нет.

Перед использованием этого использования пространство имен System.Runtime.InteropServices.

[DllImport("user32", EntryPoint = "OpenDesktopA", CharSet = CharSet.Ansi,SetLastError = true, ExactSpelling = true)]
private static extern Int32 OpenDesktop(string lpszDesktop, Int32 dwFlags, bool fInherit, Int32 dwDesiredAccess);

[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern Int32 CloseDesktop(Int32 hDesktop);

[DllImport("user32", CharSet = CharSet.Ansi,SetLastError = true,ExactSpelling = true)]
private static extern Int32 SwitchDesktop(Int32 hDesktop);

public static bool IsWorkstationLocked()
{
    const int DESKTOP_SWITCHDESKTOP = 256;
    int hwnd = -1;
    int rtn = -1;

    hwnd = OpenDesktop("Default", 0, false, DESKTOP_SWITCHDESKTOP);

    if (hwnd != 0)
    {
        rtn = SwitchDesktop(hwnd);
        if (rtn == 0)
        {
            // Locked
            CloseDesktop(hwnd);
            return true;
        }
        else
        {
            // Not locked
            CloseDesktop(hwnd);
        }
    }
    else
    {
        // Error: "Could not access the desktop..."
    }

    return false;
}
-3
ответ дан Decade Moon 24 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: