Список только отображаемых окон Windows

Перебираю все окна Windows через EnumWindows, что бы сделать скриншоты всех открытых окошек приложений. Но кроме тех окон, которые я действительно вижу на экране, EnumWindows возвращает мне еще кучу ненужных невидимых окон, например:

Microsoft Text Input Application, Microsoft Store (2штуки), Параметры (2штуки), Кино и ТВ (2штуки), и т.д.

они проходят проверки IsVisible=true и IsIconic=False, имеют в качестве изображения вполне себе черный прямоугольник (получаю его через GetWindowRect) конкретных размером и именно этим мешают жить.

Как можно отличить их от обычных окошек, которые я вижу на экране? Что бы не делать с них скриншотов (они чоорные и бесполезные ))

Вот что я наваял:

class OpenWindowsGetter
{
    [DllImport("USER32.DLL")]
    static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
    [DllImport("USER32.DLL")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    [DllImport("USER32.DLL")]
    static extern int GetWindowTextLength(IntPtr hWnd);
    [DllImport("USER32.DLL")]
    static extern bool IsWindowVisible(IntPtr hWnd);
    [DllImport("USER32.DLL")]
    static extern IntPtr GetShellWindow();
    [DllImport("User32.dll")]
    static extern bool IsIconic(IntPtr hwnd);

    delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
        /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary>
        /// <returns>A dictionary that contains the handle and title of all the open windows.</returns>
        public static IDictionary<IntPtr, string> GetOpenWindows()
        {
            IntPtr lShellWindow = GetShellWindow();
            Dictionary<IntPtr, string> lWindows = new Dictionary<IntPtr, string>();

            EnumWindows(delegate (IntPtr hWnd, int lParam)
            {
                if (hWnd == lShellWindow) return true;
                if (!IsWindowVisible(hWnd)) return true;
                if (IsIconic(hWnd)) return true;

                int lLength = GetWindowTextLength(hWnd);
                if (lLength == 0) return true;

                StringBuilder lBuilder = new StringBuilder(lLength);
                GetWindowText(hWnd, lBuilder, lLength + 1);

                lWindows[hWnd] = lBuilder.ToString();
                return true;

            }, 0);

            return lWindows;
        }
}

Потом где нибудь обрабатываем нажатие накнопку и оптравляем список окон в комбобокс WindsCB

    private void button1_Click(object sender, EventArgs e)
    {
        WindsCB.Items.Clear(); 
        IDictionary<IntPtr, string> winds = OpenWindowsGetter.GetOpenWindows();
        foreach (var item in winds) WindsCB.Items.Add(item);
    }

всем заранее огроменное спасибо!


Ответы (0 шт):