2011-08-04 1 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

맞습니다. Windows 자체가 시간을 감지 할 수 있기 때문에 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

이 프로그램이 전체 화면 앱을 올바르게 감지하면 Google에서 답변을 얻을 수 있습니다. 앱이 전체 화면에서 실행되는 경우 프로세스 이름이 표시되고 인기있는 미디어 플레이어의 이름과 일치합니다. 일치하는 항목이 발견되면 미디어 플레이어가 전체 화면으로 비디오를 재생 중임을 의미합니다. 따라서 많은 문제가 해결됩니다. –

관련 문제