Найдите ручку окна в верхней части экрана.

Я хочу проверить, когда окно внешнего приложения (игровой стол онлайн-покера) перепрыгивает через все остальные окна, потому что теперь моя очередь играть.

Проблема в том, что игровая таблица переходит на передний план... но окно не становится активным... это означает, что я не могу проверить, перепрыгивает ли она через все остальные видимые окна с помощью API GetForegroundWindow (и в fatc этот API продолжает возвращать дескриптор предыдущего окна, даже если он находится под таблицей игр, которая перепрыгивает через все окна рабочего стола). Также API GetTopWindow не работает.

Теперь вопрос: как найти дескриптор верхнего VISIBLE-окна (окна, которое поверх всех других открытых окон для моих глаз) также, если оно не активно???


Нет, окно НЕ является окном TopMost: фактически, если я нажимаю на другое окно, оно переходит в фоновый режим. Если это будет окно TopMost, оно останется сверху.

Вероятно, это ставится на первый план с помощью флага WM_SHOW или WM_NOACTIVATE.

3 ответа

Решение

Покерное приложение должно использовать Win32 API, такой как SetForegroundWindow(hWnd) чтобы вывести окно наверх, когда наступит ваша очередь.

Чтобы обнаружить такой вызов, вы можете использовать вызовы Windbg Script Tracing API.

Вы можете использовать его, чтобы увидеть API, которые приложение использует на экране Windbg, без использования другого инструмента. Если вам нужна дополнительная информация от API, просто запустите LogViewer.exe и откройте файл.lgv, который автоматически создается при использовании этого сценария.

Выходной файл с расширением.LGV.

LogViewer.exe является частью средства отладки для Windows. Он находится в том же месте, где вы установили Windbg. Откройте файл.LGV с помощью LogViewer.exe:

Исходный код для API_TRACING.TXT:

$$
$$ =============================================================================
$$ Trace APIs during the Debugging Session. 
$$ Creates a log on Desktop and Windbg window.
$$ To see the more verbose log run logviewer.exe from Debugging Tools for Windows
$$ and open the file that has the .lgv extension.
$$ This file is inside LogExts on your desktop.
$$
$$ Compatibility: Win32, should work on Win64.
$$
$$ Usage: $$>< to run the program.
$$
$$ Roberto Alexis Farah
$$ Blog: blogs.msdn.com/debuggingtoolbox/
$$
$$ All my scripts are provided "AS IS" with no warranties, and confer no rights.
$$ =============================================================================
$$
!logexts.loge
!logexts.logc e *
!logexts.logo e v
!logexts.logb p
$$
$$ ====================================
$$ Logging is enabled for this process.
$$ ====================================

Как только вы получите всю эту информацию, вы будете знать, какой вызов API нужно искать от конкретного вызывающего абонента /DLL/ и т. Д., И в это время ваша очередь, окно покера находится на вершине, и вы можете использовать эту статью базы знаний, чтобы найти дескриптор окна TopMost

EnumWindows и, возможно, WindowFromPoint API функции. Вы можете использовать их через P/Invoke в своем приложении VB.NET и сможете находить окна либо в порядке сверху вниз (EnumWindows), проверяя их местоположение, заголовок и т. Д., Чтобы идентифицировать интересующее вас окно, либо непосредственно находить окно в определенной позиции (WindowFromPoint; я подумал, что ваше окно интереса может появляться в центре экрана или в центре другого окна, которое вы уже знаете, или вы можете легко найти его по заголовку - таким образом, вы знаете точку своего интерес на экране уже есть).

Похоже, приложение может использовать SetWindowPos(..., HWND_TOPMOST, ...) стать самым верхним окном. Окна, которые расположены таким образом, не должны быть активными, чтобы появиться сверху.

В этом случае вы можете попробовать использовать GetWindow(..., GW_HWNDFIRST) найти самое верхнее окно в z-порядке оконного менеджера. См. http://support.microsoft.com/kb/126386 для краткого фрагмента кода, который делает это.

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