2012-05-27 51 views
1

如何檢查用戶是否處於非活動狀態? 我有這樣的:檢查用戶是否無效

class UserActivity : IMessageFilter 
{ 
    private double afk_time = 0.1;//minutes 
    private DateTime last_activity = DateTime.Now; 
    public static bool inactive = false; 

    private int WM_LBUTTONDOWN = 0x0201; 
    private int WM_MBUTTONDOWN = 0x0207; 
    private int WM_RBUTTONDOWN = 0x0204; 
    private int WM_MOUSEWHEEL = 0x020A; 
    private int WM_MOUSEMOVE = 0x0200; 
    private int WM_KEYDOWN = 0x0100; 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN) 
     { 
      this.last_activity = DateTime.Now; 
      inactive = false; 
     } 

     if (DateTime.Now.AddMinutes(-afk_time) > last_activity) 
      inactive = true; 

     return false; 
    } 
} 

但我必須運行在Program.cs中

Application.AddMessageFilter(new UserActivity()); 

我如何能做到這一點,我可以通過我的自我運行的用戶不活動的檢查。我會檢查一些複選框,它會開始檢查。

我想檢查全局用戶活動 - 不僅在應用程序中,而且在所有系統中。

我不想使用CPU不必要。或者我應該使用其他解決方案?

+0

這個答案/幫助你嗎? http://stackoverflow.com/questions/1421403/c-sharp-for-how-long-was-user-inactive –

+0

我看到這個線程,但我想檢查你的鏈接中的用戶不活動是Application_Idle事件。 我想知道用戶不活動多久(鼠標和鍵盤事件)。我不知道如果解決方案我使用的是正確的,如果它不會使用大量的CPU ... – sczdavos

回答

7

我發現這個,它的作品完美! 所以,如果一個又一個在這裏有它的問題是解決方案:

[StructLayout(LayoutKind.Sequential)] 
    public struct LASTINPUTINFO 
    { 
     public uint cbSize; 
     public uint dwTime; 
    } 

    [DllImport("user32.dll")] 
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 


    public static TimeSpan? GetInactiveTime() 
    { 
     LASTINPUTINFO info = new LASTINPUTINFO(); 
     info.cbSize = (uint)Marshal.SizeOf(info); 
     if (GetLastInputInfo(ref info)) 
      return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); 
     else 
      return null; 
    } 
+0

請注意Environment.TickCount返回signed int,它比WinApi GetTickCount中的無符號整型(DWORD)更早。也許GetTickCount更安全使用。由於LASTINPUTINFO.dwTime和GetTickCount都是DWORD(無符號整數)。 –

0

我試圖建立在前面的回答一類的基礎,我有測試它,它正常工作。 它是異步的,但我沒有使用異步密鑰。如果有人發現某些問題或改善如此受歡迎。

public class User 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct LASTINPUTINFO 
    { 
     public uint cbSize; 
     public uint dwTime; 
    } 

    [DllImport("user32.dll")] 
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

    public static TimeSpan? GetInactiveTime() 
    { 
     LASTINPUTINFO info = new LASTINPUTINFO(); 
     info.cbSize = (uint)Marshal.SizeOf(info); 
     if (GetLastInputInfo(ref info)) 
      return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime); 
     else 
      return null; 
    } 

    private TimeSpan? LastTime; 
    private DispatcherTimer timer = new DispatcherTimer(); 
    public void RequestUserActivity() 
    { 
     LastTime = GetInactiveTime(); 
     timer.Interval = TimeSpan.FromMilliseconds(500); 
     timer.Tick += timer_Tick; 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     TimeSpan? tmpTime = GetInactiveTime(); 
     if (LastTime.HasValue && tmpTime.HasValue && tmpTime < LastTime) 
     { 
      timer.Stop(); 
      UserAtivited(this, new EventArgs()); 
     } 
     else if (!LastTime.HasValue || !tmpTime.HasValue) 
     { 
      timer.Stop(); 
      throw new Exception(); 
     } 
    } 

    public event EventHandler UserAtivited; 
} 

現在在你的窗口中創建用戶的一個新實例,註冊UserActivated事件和laugth RequestUserActivity()。我認爲這將是有益的。


請不要對我的英文不好的問候。我是法語演講者。