2011-08-04 9 views
1

Windowsのシステムアイドル時間を測定するプログラムを探しています。私はこれを行う多くのコードを見つけました。例えば、C#でシステムのアイドル時間を測定するにはどうすればよいですか?

http://www.codeproject.com/KB/cs/GetIdleTimeWithCS.aspx

はしかし、私はまた、映画、ビデオ、など何も入力が与えられていない時間を見ているアカウントのユーザーに利用したいが、それでもシステムがアイドル状態ではありません。

どうすればよいですか?

+0

あなたの唯一の選択肢は、アイドル状態ではないとみなされているプログラムごとにAPIに接続して、その再生の有無を確認することです。 – Dani

+0

まず、アイドル時間の意味を客観的に定義してください。 – hammar

+0

私は、ユーザーが一定の時間システムを使用していないときに、wabcamの起動や監視などのタスクを実行したいだけです。 –

答えて

1

この関数は、プロセスがforgroundでフルスクリーンで実行されているかどうかを検出し、その見つかった場合は、プロセスの名前を返します。

[DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

    [DllImport("user32.dll")] 
    private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

    [DllImport("user32.dll")] 
    private static extern bool 
    GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 

    private struct POINTAPI 
    { 
     public int x; 
     public int y; 
    } 

    private struct RECT 
    { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 

    private struct WINDOWPLACEMENT 
    { 
     public int length; 
     public int flags; 
     public int showCmd; 
     public POINTAPI ptMinPosition; 
     public POINTAPI ptMaxPosition; 
     public RECT rcNormalPosition; 
    } 

    public string FullscreenProcess() 
    { 
     IntPtr foreWindow = GetForegroundWindow(); 

     // get the placement 
     WINDOWPLACEMENT forePlacement = new WINDOWPLACEMENT(); 
     forePlacement.length = Marshal.SizeOf(forePlacement); 
     GetWindowPlacement(foreWindow, ref forePlacement); 

     if (forePlacement.rcNormalPosition.top == 0 && forePlacement.rcNormalPosition.left == 0 && forePlacement.rcNormalPosition.right == Screen.PrimaryScreen.Bounds.Width && forePlacement.rcNormalPosition.bottom == Screen.PrimaryScreen.Bounds.Height) 
     { 
      uint processID; 
      GetWindowThreadProcessId(foreWindow, out processID); 
      Process proc = Process.GetProcessById((int)processID); 

      return proc.ProcessName; 
     } 
    return null; 
    } 

はこの後、私たちはただのセットで返されたプロセス名と一致する必要があります一般的なメディアプレーヤーやその他のプロセス。

制限は、ユーザーの再生を全画面表示で行うことです。

0

thisを使用してコンピュータのアイドル時間を取得することはできますが、ムービーが再生されている天気を知る方法は問題ありません。コンピュータSystem.Diagnostics.Process.GetProcesses()で現在実行されているプロセスを確認し、 a 知られている映画プレーヤー。しかし、私はこれがあなたがロックしているものを達成するとは思っていません。例えば、Gomプレーヤーが動いていることがわかっても、ビデオやオーディオを実行しているのか、場合...

+1

そうです。 APIを使ってこれを行う方法がなければなりません。なぜならウィンドウ自体は時間を検出することができるからです(映画を見ているとコンピュータ画面が消えないためです)。 –

+0

ムービープレーヤーの中には、ムービーが再生されていてもスクリーンサーバーが機能するものがあるため、ムービープレーヤーの多くは、再生中にスクリーンサーバーを抑制するオプションを追加します。 –

+0

@Shashank:例えば、Gomプレーヤーはチェックボックスオプション '再生中にスクリーンセーバーを捨てる 'を提供するので、ムービープレーヤー自体がいくつかのAPIを介してスクリプトを実行することを防ぎます。 –

0

をプレイするあなたは、フルスクリーンでビデオを見る: あなたはフルスクリーンで実行しているアプリがあるかどうかを決定します。このようなコードを使用することができます。

[DllImport("user32.dll")] 
static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll", SetLastError = true)] 
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

[StructLayout(LayoutKind.Sequential)] 
struct RECT 
{ 
    public int Left; 
    public int Top; 
    public int Width; 
    public int Height; 
} 

static bool IsBigWindowRunning() 
{ 
    foreach (Process proc in Process.GetProcesses()) 
    { 
     RECT rect; 
     var success = GetWindowRect(proc.MainWindowHandle, out rect); 
     if(success && (r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

私はよく、私にそれをテストしていませんこのラインで確実に遊び、いくつかの制限を加える:

if((r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width) 

幸運を祈る!

+1

良い提案。私もそれを試してみましょう。ここで私の経験を共有します。 –

+1

このプログラムがフルスクリーンアプリを正しく検出すると、その回答が得られる可能性があります。アプリがフルスクリーンで実行されている場合、プロセス名が取得され、一般的なメディアプレーヤーの名前と一致します。一致するものが見つかった場合は、メディアプレーヤーがフルスクリーンでビデオを再生していることを意味します。だから、多くの点で、それは問題を解決します。 –

関連する問題