2009-12-21 44 views
2

以編程方式檢查某個特定Windows機器當前是否正在被人類使用的最簡單方法是什麼?如何監視Windows中的用戶(in)活動?

我正在考慮爲我們相當有限的互聯網連接編寫一個「禮貌監視器」 - 基本上是一種查看誰在任何時候都在使用互聯網的人,所以當有人需要下載大文件時,他們可以最大限度地減少對他人的煩惱(並保持歷史統計數據,因此可以預測上行時間不會太差)。我試圖收集多個證據來源,然後用它來推斷活動。

對於Windows用戶,能夠查看他們是否正在輸入或移動鼠標或其他一些等效的活動措施將非常有用。我已經考慮過使用System.Diagnostics.Process類來查看某些進程是否正在運行(在線遊戲和其他帶寬大的應用程序)以及何時啓動。我想,如果在過去的半小時內推出了一堆常見的用戶級過程(firefox,iTunes等),這是合理的選擇,有一個肉袋坐在椅子上做某事。一旦我檢測到活動,我會向服務器發送一個小HTTP POST請求(說「嗨,我還活着,做些什麼!」),並且運行在我的Linux機器上的Web應用程序得到更新以顯示用戶處於活動狀態。

我已經考慮過使用即時通訊狀態,但不同的即時通訊客戶端似乎有不同級別的操作系統集成 - 而且人們似乎並沒有更新那些更好的內容。像所有優秀的Web 2.0公民一樣,我當然使用Twitter。 ;)

聲明:我是一個UNIX和Mac的人避免Windows。我在Mono中弄弄了.NET,但之前從未接觸過Win32 API。要溫柔。

+0

您是否擁有終端服務器許可證? – Pierreten 2009-12-21 04:42:03

+0

如何檢查屏幕保護程序是否正在運行? – 2009-12-21 04:49:14

+0

不可以。我們主要是Linux或OS X用戶,但是有少數人在他們的機器上使用Windows(XP/Vista/7)。 – 2009-12-21 04:54:28

回答

3

你可能想看看GetLastInputInfo

GetLastInputInfo函數檢索上次輸入事件的時間。

這是你通過interop調用Windows API函數:

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

[StructLayout(LayoutKind.Sequential)] 
struct LASTINPUTINFO 
{ 
    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); 

    [MarshalAs(UnmanagedType.U4)] 
    public int cbSize;  
    [MarshalAs(UnmanagedType.U4)] 
    public UInt32 dwTime; 
} 

編輯:呃,你我以前不指定的問題你使用什麼語言,我只是假設。以您爲基準的網絡爲基礎System.Diagonstics.Process

+0

謝謝。無論是C#還是C#和IronRuby的混合。 – 2009-12-21 04:51:03