C ++ поиск потока GUI из списка идентификаторов потоков - PullRequest
3 голосов
/ 18 мая 2011

Я создаю прикладную программу на C ++, которая использует хуки Windows для управления сторонними программами. Программа, которую я делаю, является учебной программой, показывающей, как использовать эти сторонние программы. Я могу найти идентификатор процесса сторонней программы, к которой я хочу подключиться, и затем могу запросить этот идентификатор процесса, чтобы найти список идентификаторов потоков, которые будут использоваться в качестве параметра для функции Windows API SetWindowsHookEx. Однако я обеспокоен тем, что из списка идентификаторов потоков из запущенного процесса я подключусь к потоку, который потенциально может закончиться в любой момент. В идеале я хотел бы подключиться к потоку, выполняющему основной графический интерфейс, который, скорее всего, будет одним из самых длинных живых потоков (и даже если это не самый длинный живой поток, учебная программа предназначена для работы с графическим интерфейсом, это все еще идеально). Если в стороннем приложении имеется более одного графического интерфейса, я хотел бы найти идентификатор потока для основного графического интерфейса.

Таким образом, мой вопрос из списка идентификаторов потоков, который я получаю, запрашивая идентификатор процесса, есть ли способ найти основной идентификатор GUI или другой подходящий поток, который будет активен до завершения работы программы? Очевидно, что у выбранного идентификатора потока должна быть очередь событий, чтобы я мог подключиться к ней.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Как насчет поиска главного окна приложения, а затем использования GetWindowThreadProcessId для получения идентификатора потока этого?

Если вы еще не знаете главное окно, попробуйте найти его с помощью FindWindow ()если вы знаете имя окна и имя класса или EnumWindows () для перечисления по всем окнам верхнего уровня на рабочем столе и проверьте, принадлежат ли они целевому процессу (снова с помощью GetWindowThreadProcessId и сравните с идентификатором вашего процесса).

Главное окно обычно одно с установленным битом (стилями) WS_CAPTION.Следует также проверить, что окно является видимым (IsWindowVisible), чтобы избежать скрытых рабочих окон (которые часто принадлежат рабочим потокам).Можно также проверить наличие стилей WS_POPUP и WS_EX_TOOLWINDOW, чтобы отфильтровать плавающие и диалоговые окна верхнего уровня - хотя в любом случае они обычно принадлежат основному потоку GUI.

Приложение может иметь столько же «главных окон» и GUIтемы как хочет;как правило, есть только один - но ничто не мешает разработчику создавать несколько потоков, каждый из которых имеет собственное главное окно верхнего уровня и цикл сообщений.Если вам нужно разобраться с этим делом, вам лучше всего подключить все потоки к своему интерактивному интерфейсу.

1 голос
/ 17 апреля 2017

Самый простой и надежный способ определить, является ли поток потоком с графическим интерфейсом, - это вызвать GetGUIThreadInfo :

Если указанный поток не [...]иметь входную очередь, функция завершится ошибкой.

Среди прочего наличие входной очереди отличает поток графического интерфейса от обычного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...