سؤال

مكررة: كيف يمكنك برمجيا تحديد ما إذا كان العمل هو مغلق ؟

كيف يمكن اكتشاف (أثناء التشغيل) عندما مستخدم Windows مقفل الشاشة (Windows+L) مقفلة مرة أخرى.وأنا أعلم أنني يمكن أن عالميا تتبع مدخلات لوحة المفاتيح ، ولكن هل من الممكن أن تحقق شيء من هذا القبيل مع البيئة المتغيرات ؟

هل كانت مفيدة؟

المحلول

يمكنك الحصول على هذا الإخطار عن طريق WM_WTSSESSION_CHANGE الرسالة.يجب أن يخطر النوافذ التي كنت ترغب في تلقي هذه الرسائل عبر WTSRegisterSessionNotification و إلغاء تسجيل مع WTSUnRegisterSessionNotification.

هذه الوظائف أن تكون مفيدة ل C# التنفيذ.

http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification

http://blogs.msdn.com/shawnfa/archive/2005/05/17/418891.aspx

http://bytes.com/groups/net-c/276963-trapping-when-workstation-locked

نصائح أخرى

A SessionSwitch الحدث قد يكون أفضل رهان هذا.التحقق SessionSwitchReason مرت SessionSwitchEventArgs لمعرفة ما هو نوع من التبديل فمن والرد بشكل مناسب.

يمكنك استخدام ComponentDispatcher باعتبارها وسيلة بديلة للحصول على تلك الأحداث.

هنا مثال على فئة التفاف.

public class Win32Session
{
    private const int NOTIFY_FOR_THIS_SESSION = 0;
    private const int WM_WTSSESSION_CHANGE = 0x2b1;
    private const int WTS_SESSION_LOCK = 0x7;
    private const int WTS_SESSION_UNLOCK = 0x8;

    public event EventHandler MachineLocked;
    public event EventHandler MachineUnlocked;

    public Win32Session()
    {
        ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
    }

    void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)
    {
        if (msg.message == WM_WTSSESSION_CHANGE)
        {
            int value = msg.wParam.ToInt32();
            if (value == WTS_SESSION_LOCK)
            {
                OnMachineLocked(EventArgs.Empty);
            }
            else if (value == WTS_SESSION_UNLOCK)
            {
                OnMachineUnlocked(EventArgs.Empty);
            }
        }
    }

    protected virtual void OnMachineLocked(EventArgs e)
    {
        EventHandler temp = MachineLocked;
        if (temp != null)
        {
            temp(this, e);
        }
    }

    protected virtual void OnMachineUnlocked(EventArgs e)
    {
        EventHandler temp = MachineUnlocked;
        if (temp != null)
        {
            temp(this, e);
        }
    }
}

كنت على الاطلاق لا حاجة WM_WTSSESSION_CHANGE مجرد استخدام الداخلية WTTS واجهات برمجة التطبيقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top