Сейчас на форуме: tyns777 (+4 невидимых) |
eXeL@B —› Программирование —› Перехват попытки активации окна фонового приложения на низком уровне, т.е. без ::SetWindowsHookEx() |
Посл.ответ | Сообщение |
|
Создано: 25 октября 2010 02:46 · Поправил: okobaka · Личное сообщение · #1 Приветствую вас, джентльмены. В общем, кратко суть вопроса звучит так: нужно отследить попытку переключения в фоновое приложение под Windows. Т.е. юзер кликает мышкой по окну фонового приложения, либо по его кнопке в панели задач, либо Alt-Tab'ится в него - мне нужна нотификация об этом событии. Все казалось бы просто, юзать системные хуки и дело в шляпе. Но если процесс или его главный тред в состоянии саспенда или под отладкой, то хуки не работают Буду очень признателен вам, если хотя бы укажете направление поиска. А то я перерыл уже MSDN, Win32 API и NtXXX/KeXXX функции ядра, но ничего подходящего пока не нашел... |
|
Создано: 25 октября 2010 03:35 · Личное сообщение · #2 |
|
Создано: 25 октября 2010 03:53 · Личное сообщение · #3 Т.е. я так понимаю, мне нужно брутально хукать эту функцию на уровне всей системы? У меня есть предположение, что Shell (explorer.exe по дефолту) как-то знает про треды в саспенде и говорит ядру накапливать сообщения для их message queue где-то во внутренних очередях. Потому что как только тред выходит из саспенда ему начинают сыпаться все клики/мувы и т.д. А до этого момента - ни шороха даже по системным хукам... |
|
Создано: 25 октября 2010 04:23 · Личное сообщение · #4 |
|
Создано: 25 октября 2010 09:14 · Личное сообщение · #5 |
|
Создано: 25 октября 2010 09:27 · Личное сообщение · #6 |
|
Создано: 25 октября 2010 09:58 · Личное сообщение · #7 |
|
Создано: 25 октября 2010 10:21 · Личное сообщение · #8 |
|
Создано: 25 октября 2010 19:05 · Личное сообщение · #9 |
|
Создано: 25 октября 2010 21:41 · Личное сообщение · #10 |
|
Создано: 25 октября 2010 22:44 · Личное сообщение · #11 okobaka Может возникнуть проблема с поиском ссылки на первый массив. В XP например все три массива(третий с векторами) находятся друг около друга. Но в иной версии их расположение может отличаться. Значит как искать. Два способа как обычно - релоки или дизасм. Если дизасм, то можно поступить следующим образом. Необходима опорная функция, раз это шадов, то разумеется она будет сервисом. Подходит NtUserMessageCall. Стаб не экспортируется. Значит нужно вытянуть идентификатор из экспортируемой апи, подходит SendNotifyMessageA(). Разбираем сервис и находим там последовательность: Code:
Отсюда извлекаем две ссылки: o MessageTable o gapfnMessageCall Теперь можно найти ссылку на gapfnScSendMessage, енумом релоков для MessageTable(этот проще), либо опятьже дизасмом. Для последнего способа подходит сервис NtUserDispatchMessage. Ссылка в стаб находится в DispatchMessageA. Code:
Найдём таким образом последний массив: o gapfnScSendMessage Проблема: Шадова код очень сильно размазан по всему модуля, так что поиск без построения графа врятле возможен. зы: Это всё теоретически, сам я это никогда не юзал. |
|
Создано: 26 октября 2010 05:57 · Личное сообщение · #12 Clerk, спасибо. Однако боюсь этот метод для меня не подойдет. Тут проблема в том, что окну засаспендженного треда сообщения в очередь похоже не ложатся - они складируются в системной очереди. Похоже, мне нужно колбэк или сообщение от шелла получать. Он их дальше роутит в ядро, ядро видит что тред спит и не постит ему сообщения, а накапливает. Т.е. ваш метод это несколько глубже, чем нужно. В любом случае, спасибо за то, что потратили время на ответ. Эти знания мне пригодятся в будущем так точно. |
eXeL@B —› Программирование —› Перехват попытки активации окна фонового приложения на низком уровне, т.е. без ::SetWindowsHookEx() |