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

时间:2016-05-05 18:33:25

标签: winapi windows-console windows-messages spy++

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

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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

  

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

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

答案 1 :(得分:0)

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

按照运算的问题:

" 有没有办法阻止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位)的进程的事件"

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