Почему 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 бита)"

Предполагается, что можно получить события окна консоли.

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