为什么 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 事件。
我试图使用 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 事件。