2009-12-21 2 views
2

인간이 특정 Windows 시스템을 현재 사용하고 있는지 여부를 프로그램 방식으로 확인하는 가장 간단한 방법은 무엇입니까?Windows에서 사용자 (인) 활동을 모니터링하는 방법은 무엇입니까?

제한된 인터넷 연결을위한 "공손한 모니터"를 작성하려고합니다. 기본적으로 현재 인터넷을 적극적으로 사용하고있는 사람을 볼 수 있으므로 누군가 큰 파일을 다운로드해야하는 경우 다른 사람들에 대한 성가심을 최소화 할 수 있으며 통계를 역사적으로 유지할 수 있으므로 업 링크가 너무 늦지 않을 때를 예측할 수 있습니다. 나는 활동을 추론하는 데 사용할 수있는 여러 증거 자료를 모으려고합니다.

Windows 사용자는 마우스를 타이핑하거나 움직이는 지 또는 다른 동등한 측정 방법을 볼 수있는 것이 유용 할 것입니다. 나는 이미 System.Diagnostics.Process 클래스를 사용하여 특정 프로세스가 실행 중인지 (온라인 게임 및 기타 대역폭이 많은 앱) 및 실행 시점을 확인했습니다. 지난 30 분 동안 일반 유저 랜드 프로세스 (파이어 폭스, 아이튠즈 등)가 시작 되었다면 의자에 앉아 고기를 들고 뭔가를하는 것이 합리적이라고 생각한다. 활동을 감지하면 서버에 작은 HTTP POST 요청 ("안녕하세요, 생존 중입니다"라고 말함)을 보내고 내 Linux 상자에서 실행중인 웹 애플리케이션이 업데이트되어 사용자가 활성 상태임을 보여줍니다.

메신저 상태를 사용하는 것으로 생각했지만 다른 메신저 클라이언트는 다양한 수준의 OS 통합을 갖고있는 것처럼 보입니다. 모든 훌륭한 웹 2.0 시민들과 마찬가지로 저는 트위터를 사용하고 있습니다. ;)

면책 조항 : 저는 Windows를 사용하지 않는 UNIX 및 Mac 사용자입니다. Mono에서는 .NET으로 시작했지만 전에는 Win32 API를 사용하지 않았습니다. 부드럽게 다루십시오.

+0

터미널 서버 라이센스가 있습니까? – Pierreten

+0

스크린 세이버가 실행 중인지 확인하는 방법은 무엇입니까? –

+0

아니요. 우리는 주로 Linux 또는 OS X 사용자이지만 컴퓨터에 Windows (XP/Vista/7)를 사용하는 소수의 사람들이 있습니다. –

답변

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

편집 : 어, 당신은 어떤 언어 사용중인 질문에 지정 did't, 난 그냥 추측했다. 참조한 이후 닷넷 System.Diagonstics.Process

+0

감사합니다. C# 또는 C#과 IronRuby의 혼합. –

관련 문제