为什么 Spy++ 会因控制台 windows 而失败

Why does Spy++ fail with console windows

我试图使用 Spy++ (运行 Windows 7) 验证消息是否正在发送到我的 window,但我错误地试图监视控制台 window 我的程序用于调试输出。 Spy++ 立即通知我 "The specified window cannot be spied upon. Windows will not allow access to the message stream for this window."

虽然 Spy++ 确实正确收集了有关 window 的其他信息(e.x。名称、样式、class 名称),但它无法处理消息队列。为什么是这样?而且,出于病态的好奇心,有没有办法阻止 Spy++ 使用 Windows API?

访问我自己自定义 window 的消息队列

While Spy++ does correctly gather other information about the window (e.x. name, style, class name), it cannot process the message queue. Why is this?

控制台window属于CSRSS进程,不属于CMD.EXE进程。 CSRSS 是一项受保护的关键系统服务,如果没有特殊的调试权限就无法挂钩。

"当用户模式进程调用涉及 console windows、process/thread 创建或并行的函数时侧支持,而不是发出系统调用,Win32 库(kernel32.dll、user32.dll、gdi32.dll)向 CSRSS 进程发送进程间调用 在不影响内核的情况下完成大部分实际工作。"

And, out of morbid curiosity, is there a way to prevent Spy++ from accessing the message queue of my own custom window using the Windows API?

通常不会。除非您设法 运行 您的 window 在受保护的系统进程中。

所以,我最近自己发现了这一点,我创建了一个控制台 .NET 应用程序,它使用 CMD.EXE 启动了一个进程,我 运行 遇到了键盘周围一些 Win32 互操作的问题。所以我打开了以前值得信赖的 Spy++ 实用程序来查看发生了什么,发现我完全无法从它监视我的应用程序的消息队列。

所以根据操作者的问题:

"有没有办法阻止 Spy++ 使用 Windows API 访问我自己自定义 window 的消息队列?

有一个限制 windows classes 的列表被烘焙到 Spy++ 中:

  • SpyxxHk(估计是自己hooking了class),
  • #32768(上下文菜单),
  • #32769(桌面),
  • ttyGrab ,
  • ConsoleWindowClass(命令提示符)

因此,如果您以任何方式将您的应用程序绑定到这些 classes Spy++ 将在尝试查看他们的消息时显示该阻止消息,当然这可能没有用,因为它仅限制那些 classes.

参考 MS 文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx

"For out-of-context events, the event is delivered on the same thread that called SetWinEventHook. In some situations, even if you request WINEVENT_INCONTEXT events, the events will still be delivered out-of-context. These scenarios include events from console windows and events from processes that have a different bit-depth (64 bit versus 32 bits)"

表明可以获取控制台 window 事件。