Почему Spy++ терпит неудачу с консольными окнами
Я пытался проверить, что сообщения отправлялись в мое окно с помощью Spy++ (под управлением Windows 7), но я по ошибке пытался следить за окном консоли, которое моя программа использовала для вывода отладки. Spy++ незамедлительно уведомил меня, что "за указанным окном нельзя шпионить. Windows не разрешит доступ к потоку сообщений для этого окна".
Хотя Spy ++ правильно собирает другую информацию об окне (бывшее имя, стиль, имя класса), он не может обработать очередь сообщений. Почему это? И, из-за болезненного любопытства, есть ли способ запретить Spy ++ доступ к очереди сообщений моего собственного настраиваемого окна с помощью Windows API?
2 ответа
Хотя Spy++ правильно собирает другую информацию об окне (бывшее имя, стиль, имя класса), он не может обработать очередь сообщений. Почему это?
Окно консоли принадлежит процессу CSRSS, а не процессу CMD.EXE. CSRSS является критически важной системной службой, которая защищена и не может быть перехвачена без специальных прав отладки.
"Когда процесс пользовательского режима вызывает функцию, включающую консольные окна, создание процесса / потока или параллельную поддержку, вместо системного вызова библиотеки Win32 (kernel32.dll, user32.dll, gdi32.dll) послать межпроцессный вызов процессу CSRSS, который выполняет большую часть реальной работы, не ставя под угрозу ядро."
И, из-за болезненного любопытства, есть ли способ запретить Spy++ доступ к очереди сообщений моего собственного настраиваемого окна с помощью Windows API?
Как правило, нет. Если вам не удастся запустить окно в защищенном системном процессе.
Итак, недавно я обнаружил это сам, создал консольное приложение.NET, которое запускает процесс с использованием CMD.EXE, и столкнулся с проблемой взаимодействия Win32 с клавиатурой. Поэтому я запустил ранее верную утилиту Spy++, чтобы посмотреть, что происходит, и обнаружил, что я совершенно не в состоянии отслеживать из нее очередь сообщений для своего приложения.
Итак, согласно вопросу оп:
"Есть ли способ запретить Spy++ доступ к очереди сообщений моего собственного пользовательского окна с помощью Windows API?"
Существует список ограниченных классов окон, запеченных в Spy++:
- SpyxxHk (предположительно, это собственный класс перехвата),
- # 32768 (контекстное меню),
- # 32769 (рабочий стол),
- ttyGrab,
- ConsoleWindowClass (Командная строка)
Таким образом, если вы каким-либо образом привязываете свое приложение к этим классам, Spy++ будет отображать это сообщение о блокировке при попытке просмотреть их сообщения, конечно, это может оказаться бесполезным, поскольку ограничивает только эти классы.
Ссылаясь на документацию MS:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx
"Для событий вне контекста событие доставляется в том же потоке, который вызвал SetWinEventHook. В некоторых ситуациях, даже если вы запрашиваете события WINEVENT_INCONTEXT, события все равно будут доставлены вне контекста. Эти сценарии включают в себя события из консоли окна и события процессов, которые имеют разную битовую глубину (64 бита и 32 бита)"
Предполагается, что можно получить события окна консоли.