1

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

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

4

2 回答 2

4

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

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

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

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

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

于 2016-05-05T19:19:13.697 回答
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 位)的进程的窗口和事件"

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

于 2018-01-02T02:07:59.227 回答