为什么Spy ++在控制台窗口失败

问题描述 投票:1回答:2

我试图验证使用Spy ++(运行Windows 7)将消息发送到我的窗口,但是我错误地试图窥探我的程序用于调试输出的控制台窗口。 Spy ++立即通知我“指定的窗口无法被监视.Windows将不允许访问此窗口的消息流。”

虽然Spy ++正确地收集了有关窗口的其他信息(例如,名称,样式,类名),但它无法处理消息队列。为什么是这样?并且,出于病态的好奇心,有没有办法阻止Spy ++使用Windows API访问我自己的自定义窗口的消息队列?

winapi windows-console windows-messages spy++
2个回答
4
投票

虽然Spy ++正确地收集了有关窗口的其他信息(例如,名称,样式,类名),但它无法处理消息队列。为什么是这样?

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

“当用户模式进程调用涉及控制台窗口,进程/线程创建或并行支持的函数,而不是发出系统调用时,Win32库(kernel32.dll,user32.dll,gdi32.dll)向CSRSS进程发送进程间调用,该进程执行大部分实际工作而不会损害内核。“

并且,出于病态的好奇心,有没有办法阻止Spy ++使用Windows API访问我自己的自定义窗口的消息队列?

通常,没有。除非您设法在受保护的系统进程中运行窗口。


0
投票

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

所以按照op的问题:

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

Spy ++中有一个受限制的Windows类列表:

  • 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位)的进程的窗口和事件“

建议可以获得控制台窗口事件。

© www.soinside.com 2019 - 2024. All rights reserved.