Список только отображаемых окон 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);
}
всем заранее огроменное спасибо!