Точное обнаружение Alt-Tab / переключения задач / окна переднего плана

Учитывая действительный hwnd, как мы можем проверить, действительно ли это окно с альтернативной вкладкой?

Один из моих предыдущих методов заключался в том, чтобы получить класс окна, которому принадлежит hwnd, а затем сравнить его со следующими значениями: MultitaskingViewFrame, ForegroundStaging, TaskSwitcherWnd и TaskSwitcherOverlayWnd.

Однако я пришел к выводу, что имена классов не уникальны в системе, и действительно можно RegisterClassEx класс с тем же именем, что и приведенные выше имена, что означает, что мой метод выше даст ложные срабатывания.

Загляните в блог и попробуйте функцию IsAltTabWindow.

Strive Sun 21.12.2020 10:26

К сожалению, моя цель состоит в том, чтобы точно обнаружить окно Alt-Tab/переключение задач/ForegroundStaging, вместо того, чтобы найти, какое окно попадает в список Alt-Tab.

Enigmatrix Atheros 21.12.2020 18:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
775
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я рекомендую использовать функцию SetWinEventHook, чтобы правильно получить информацию об активном отображении.

HWINEVENTHOOK SetWinEventHook(
  DWORD        eventMin,
  DWORD        eventMax,
  HMODULE      hmodWinEventProc,
  WINEVENTPROC pfnWinEventProc,
  DWORD        idProcess,
  DWORD        idThread,
  DWORD        dwFlags
);
 DWORD        eventMin,
 DWORD        eventMax, 

Достаточно указать в качестве аргументов константы EVENT_SYSTEM_FOREGROUND.

Я на самом деле получаю hwnds от SetWinEventHook. В частности, я установил крючок для EVENT_SYSTEM_FOREGROUND. Если я нажимаю alt-tab, окно переключается быстро, но обратный вызов запускается для окна переключателя задач и какого-либо другого невидимого окна с классом ForegroundStaging. В основном я хочу отфильтровать эти окна, но мне также нужно учитывать мошеннические процессы, которые пытаются маскироваться под ForegroundStaging и т. д.

Enigmatrix Atheros 20.12.2020 14:45

Если я нажму alt-tab, окно быстро переключается, но обратный вызов запускается для окна Task Switcher и некоторых других невидимых окон с класс ForegroundStaging.

Для невидимых окон вы можете использовать IsWindowVisible для фильтрации.

Для окна переключателя задач вы можете сравнить их имена заголовков с фильтром.

Некоторый код:

void __stdcall Wineventproc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD idEventThread, DWORD dwmsEventTime)
{
    if (event == EVENT_SYSTEM_FOREGROUND)
    {
         if (IsWindowVisible(hwnd))
        {
            TCHAR title[512] = {};
            int index = GetWindowText(hwnd, title, 512);
            if (_tcsncmp(title, TEXT("Task Switching"), 14))
            {
                title[index] = L'\n';
                title[index + 1] = L'\0';
                OutputDebugString(title);
            }
        }
    }
}

но мне также нужно учитывать мошеннические процессы, которые пытаются маскироваться как ForegroundStaging и т. д.

Это сложный вопрос. Ни один антивирус или технология защиты не совершенны. Требуется время, чтобы выявить и заблокировать вредоносные сайты и приложения или доверять недавно выпущенным программам и сертификатам. При наличии почти 2 миллиардов веб-сайтов в Интернете и программного обеспечения, которое постоянно обновляется и выпускается, невозможно получить информацию о каждом отдельном сайте и программе.

Другими словами, непросто эффективно идентифицировать истинную личность каждого неизвестного приложения.

См.: Неизвестно — Неопознанное программное обеспечение

Ответ принят как подходящий

Я нашел работающее решение проблемы: дополнительно отфильтровать по пути процесса с помощью GetWindowModuleFileNameW.

грубый псевдокод:

if window.class() in [..] && GetWindowModuleFileNameW(window.hwnd) == "C:\Windows\explorer.exe" {
    ignore()
}

Процессы не могут подделать свой путь, так что это работает.

Это хорошее решение, вы сравниваете заголовок «Переключение задач» и имя класса «XamlExplorerHostIslandWindow» — как насчет локализованных версий Windows, они остаются такими же, например, на японском Win11?

Tom 22.02.2022 13:05

Заголовок окна обычно надежен, процессы могут легко его редактировать. Я помню, как проверял имена классов окон на французском языке, те, которые использует Windows, такие как Task Explorer, Windows Explorer и т. д., Все еще на английском языке. Возможно, из-за того, что имена классов обычно не выставляются пользователю. Имена классов также могут быть подделаны, поэтому приведенная выше проверка на использование GetWindowModuleFileNameW используется как лучшая гарантия. Я не уверен насчет XamlExplorerHostIslandWindow, это имя класса для Explorer в Win11?

Enigmatrix Atheros 22.02.2022 18:25

Да, я разрабатываю для Win11, так что там используется новое имя класса... Вы знаете, какое имя класса было для Win7?

Tom 24.02.2022 13:34

Другие вопросы по теме