Как измерить время простоя системы в C #, исключая при просмотре фильмов и т. Д.? - PullRequest
1 голос
/ 04 августа 2011

Я ищу программу, которая измеряет время простоя системы в Windows.Я нашел много кодов, которые делают это.Например,

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

Однако я также хочу принять во внимание, что пользователь смотрит фильмы, видео и т. Д. В этот раз ввод не производится, но система все еще не находится в режиме ожидания.

Есть ли еще способ сделать это?

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Эта функция определяет, запущен ли процесс в полноэкранном режиме в 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 голосов
/ 04 августа 2011

Если вы смотрите видео в полноэкранном режиме: Вы можете использовать такой код, чтобы определить, есть ли приложение, работающее в полноэкранном режиме:

[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)

Удачи!

0 голосов
/ 04 августа 2011

Вы можете получить простой для компьютера, используя this , однако ваша проблема заключается в том, как узнать погоду, в которой воспроизводится фильм, вы можете проверить процессы, которые в данный момент выполняются на компьютере System.Diagnostics.Process.GetProcesses(), и затем проверьте, является ли один из них известным видеоплеером. Однако я не думаю, что это достигнет того, для чего вы заблокированы, потому что даже если вы обнаружите, что, например, запущен Gom-плеер, вы все равно не знаете, работает ли он с видео или аудио или просто открывается без каких-либо вещей. играть ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...