我试图验证使用Spy ++(运行Windows 7)将消息发送到我的窗口,但我错误地试图窥探我的程序用于调试输出的控制台窗口。间谍++迅速通知我"指定的窗口无法被监视。 Windows将不允许访问此窗口的消息流。"
虽然Spy ++正确收集了有关窗口的其他信息(例如,名称,样式,类名),但它无法处理消息队列。为什么是这样?并且,出于病态的好奇心,有没有办法阻止Spy ++使用Windows API访问我自己的自定义窗口的消息队列?
答案 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类:
因此,如果您以任何方式将应用程序与这些类绑定,Spy ++会在尝试查看其消息时显示该消息,当然这可能不会有用,因为它只会限制这些类。
参考MS文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx
"对于上下文事件,事件在调用SetWinEventHook的同一线程上传递。在某些情况下,即使您请求WINEVENT_INCONTEXT事件,事件仍将在上下文之外传递。这些方案包括来自控制台窗口的事件和来自具有不同位深度(64位对32位)的进程的事件"
建议可以获取控制台窗口事件。