在窗口出现之前拦截并隐藏它

时间:2010-12-03 16:47:56

标签: c# c++ windows message-queue subclass

我正在开发一个(进程内)插件到应用程序,作为我的插件的一部分,我想用我自己的替换应用程序的工具提示。但是,我没有可用的API,所以我决定进入低级别。

我知道工具提示的窗口类,但问题是,我如何检测它正在创建以及如何在之后关闭它?

这是我到目前为止所做的事情:

  1. 在WM_CREATE
  2. 上创建系统范围的挂钩
  3. 捕获时,检查WM_CREATE目标的类和过程
  4. 确认它确实是我关心的窗口:
    • 如果该过程是我的插件所在的过程
    • 如果班级类型正确
    • 如果正确的应用程序是焦点(在多个应用程序的情况下)
  5. 将WM_DESTROY发送到创建的窗口并在其位置创建我自己的窗口
  6. 听起来怎么样?假设确实没有API来处理工具提示,那么我需要一种更简单的方法吗?

    谢谢!

    P.S标记为C ++ / C#,因为我打算用这两种语言编写它(C ++用于系统范围的钩子,C#用于其他所有语言)

2 个答案:

答案 0 :(得分:2)

如果您知道要阻止的窗口类型,则可以简单地将其子类化并在您自己的WndProc中处理销毁。在工具提示类上使用GetClassLongPtr()GCL_WNDPROC,在GCL_WNDPROC上使用SetClassLongPtr()设置自己的WndProc,并在WM_CREATE上调用DestroyWindow()并为剩下的人调用旧的WndProc ..

答案 1 :(得分:0)

这不会奏效。考虑您正在替换工具提示的应用程序视图,并假设您可以告诉它销毁窗口。当应用决定需要关闭工具提示时会发生什么?它没有新窗口的把手,它有旧窗口的把手,你已经销毁了它。事情出错的时候。

如果您希望此工作提示顺利运行,您的插件系统需要明确支持替换工具提示。也许插件框架的可选部分可以是RequestTooltip函数。如果它不存在,或者返回null,或者使用默认的工具提示,则使用默认的工具提示,否则将使用您提供的插件。