У меня есть приложение Win32, которое определяет, отображаются ли какие-либо видимые, не-знаковые, минимизируемые окна. Насколько мне известно, он отлично работал для Win9x до Win8.1, но в Windows 10 он часто находит несколько окон, которые на самом деле не видны на экране.
Чтобы попытаться определить, что происходит, я написал простое тестовое приложение, которое перечисляет и записывает все такие окна. Здесь суть кода обратного вызова EnumWindows:
BOOL CALLBACK EnumFunc( HWND hWnd, LPARAM lParam )
{
if ( IsWindowVisible( hWnd ) )
{
if ( !IsIconic( hWnd ) )
{
const LONG style = GetWindowLong( hWnd, GWL_STYLE );
if ( WS_MINIMIZEBOX & style )
{
// record window info
}
}
}
return TRUE;
}
Большинство окон phantom под Windows 10 принадлежат процессам приложений фонового хранилища, таким как Mail, Calculator и Photos. Они перечислены в разделе "Фоновые процессы" диспетчера задач, и если я использую диспетчер задач для завершения этих фоновых задач, их окно phantom больше не будет найдено моим тестовым приложением.
В приведенном выше скриншоте из моего тестового приложения вы можете видеть, что все, кроме одного из оскорбительных окон, принадлежат нитьм того же идентификатора процесса 7768, который является ApplicationFrameHost.exe. В последнем окне с идентификатором процесса 11808 является explorer.exe.
Я просмотрел окна phantom со Spy ++ и не вижу никакой конкретной комбинации стилей, которая помогла бы однозначно идентифицировать их.
У меня было предположение, что могут быть задействованы недокументированные "группы" Windows, но я попытался использовать (недокументированный, так что это может быть неправильно) API:
BOOL WINAPI GetWindowBand (HWND hWnd, PDWORD pdwBand);
но он возвращает полосу 1 для любого окна, поэтому не дифференцирует эти фантомы.
Как надежно идентифицировать эти окна phantom?