Есть ли API для Vista, чтобы определить, работает ли рабочий стол на весь экран? - PullRequest
3 голосов
/ 15 октября 2008

Например, пользователь воспроизводит фильм в полноэкранном режиме или смотрит на powerpoint в полноэкранном режиме?

Я мог бы поклясться, что раньше видел API IsFullScreenInteractive, но сейчас не могу его найти

Ответы [ 4 ]

4 голосов
/ 30 января 2009

Вот как я решил эту проблему:

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(IsForegroundWwindowFullScreen());
        }

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

        [DllImport("user32.dll")]
        static extern int GetSystemMetrics(int smIndex);

        public const int SM_CXSCREEN = 0;
        public const int SM_CYSCREEN = 1;

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(IntPtr hWnd, out W32RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct W32RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        public static bool IsForegroundWwindowFullScreen()
        {
            int scrX = GetSystemMetrics(SM_CXSCREEN),
                scrY = GetSystemMetrics(SM_CYSCREEN);

            IntPtr handle = GetForegroundWindow();
            if (handle == IntPtr.Zero) return false;

            W32RECT wRect;
            if (!GetWindowRect(handle, out wRect)) return false;

            return scrX == (wRect.Right - wRect.Left) && scrY == (wRect.Bottom - wRect.Top);
        }
    }
}
3 голосов
/ 31 июля 2009

Vista действительно имеет API для этой цели - она ​​называется SHQueryUserNotificationState .

2 голосов
/ 15 октября 2008

Используйте GetForegroundWindow, чтобы получить дескриптор окна, с которым работает пользователь. GetClientRect даст размеры активной части окна без границ; используйте ClientToScreen для преобразования прямоугольника в координаты монитора.

Вызовите MonitorFromRect или MonitorFromWindow, чтобы получить монитор, в котором находится окно. Используйте GetMonitorInfo для получения координат монитора.

Сравните два прямоугольника - если прямоугольник окна полностью покрывает прямоугольник монитора, это полноэкранное окно.

0 голосов
/ 12 июля 2009

Предпочтительным способом определения состояния окна является вызов GetWindowPlacement . Если вы делаете это в сочетании с GetForegroundWindow, вы можете легко проверить, видит ли пользователь полноэкранное окно или нет.

...