Вместо того, чтобы просто получать активное или переднее окно, мне конкретно нужно каждое окно, которое пользователь может видеть на своем экране.
Для ясности и простоты использования я также использую Библиотека DataDink WindowScrape в качестве оболочки для User32, но она предоставляет только полезные функции и удобство чтения.
Вот все основные, которые я пробовал до сих пор, но безуспешно:
IsWindowVisible() из темы «Как проверить, имеет ли окно установленный WS_VISIBLE? (или является ли видимым)».
Код: Выделить всё
// EnumHwnds wrapper that returns a list of WindowObjects
List windows = Window.GetWindows();
foreach (Window window in windows)
{
// Gets hwnd from window object
IntPtr hWnd = window.Hwnd;
bool isVisible = IsWindowVisible(hWnd);
if (isVisible){
Console.WriteLine(window);
}
}
GetWindowLong(), затем IsWindowVisible() from ветку выше.
Код: Выделить всё
private const int GWL_STYLE = -16;
...
...
// EnumHwnds wrapper that returns a list of WindowObjects
List windows = Window.GetWindows();
foreach (Window window in windows)
{
// Gets hwnd from window object
IntPtr hWnd = GetWindowLong(window.Hwnd, GWL_STYLE);
bool isVisible = IsWindowVisible(hWnd);
if (isVisible){
GD.Print(window);
}
}
Рассмотрение маскировки окон из статьи Рэймонда Чена
Код: Выделить всё
static bool IsWindowCloaked(IntPtr hwnd)
{
bool isCloaked = false;
int result = DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, out isCloaked, sizeof(bool));
return (result == S_OK) && isCloaked;
}
static bool IsWindowVisibleOnScreen(IntPtr hwnd)
{
return IsWindowVisible(hwnd) && !IsWindowCloaked(hwnd);
}
...
...
// EnumHwnds wrapper that returns a list of WindowObjects
List windows = Window.GetWindows();
foreach (Window window in windows)
{
// Gets hwnd from window object
IntPtr hWnd = GetWindowLong(window.Hwnd, GWL_STYLE);
bool isVisible = IsWindowVisibleOnScreen(hWnd);
if (isVisible){
GD.Print(window);
}
}
Вкратце
Вкратце
Я хочу, чтобы все окна, которые пользователь может физически видеть на своем экране. Я хочу игнорировать окна, закрытые другим (то есть невидимые для пользователя), и принимать окна, которые частично открыты.
До сих пор я использовал библиотеку User32, но У меня не очень большой опыт работы с C# и я возился с библиотеками Windows, поэтому готов признать, что это может быть не решение.
Я также готов переписать это на C++ если это более жизнеспособно.
ПРИМЕЧАНИЕ. Этот пост отмечен тегами C#, C и C++, поскольку, насколько мне известно, эту библиотеку можно использовать на всех трех языках, и решение на любом из этих языков было бы полезно.
Подробнее здесь: https://stackoverflow.com/questions/782 ... en-windows
Мобильная версия