2009-03-02 4 views
7

DUPLICATE:How can I programmatically determine if my workstation is locked?Kiểm tra máy trạm thay đổi khóa/mở khóa với C#

Làm thế nào tôi có thể phát hiện (trong thời gian chạy) khi người dùng Windows đã bị khóa màn hình của họ (Windows + L) và mở khóa nó một lần nữa. Tôi biết tôi có thể theo dõi toàn cầu đầu vào bàn phím, nhưng có thể kiểm tra điều đó với các biến môi trường không?

+0

Câu trả lời cho câu hỏi này có thể cung cấp điểm khởi đầu cho bạn. http://stackoverflow.com/questions/44980 –

+0

Cảm ơn mọi người. Bạn đã rất hữu ích như mọi khi :) –

Trả lời

3

Bạn có thể nhận thông báo này qua tin nhắn WM_WTSSESSION_CHANGE. Bạn phải thông báo cho Windows rằng bạn muốn nhận các thư này qua WTSRegisterSessionNotification và hủy đăng ký với WTSUnRegisterSessionNotification.

Các bài đăng này sẽ hữu ích cho việc triển khai 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

+0

Đánh bại tôi một vài giây :) – shahkalpesh

+0

-1: Phiên bản mã được quản lý của điều này đã được đăng trước phiên bản Win32 ... tại sao điều này thậm chí còn được đánh dấu là câu trả lời đúng? – Powerlord

+0

Khó có thể là một lý do cho một lời nói dối, eh? –

-2

Bạn hoàn toàn không cần WM_WTSSESSION_CHANGE Chỉ cần sử dụng apis WTTS nội bộ.

2

Bạn có thể sử dụng ComponentDispatcher làm cách thay thế để nhận các sự kiện đó.

Đây là một lớp mẫu để bọc nó.

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