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

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

我知道工具提示的窗口类,但问题是,如何检测它正在创build,然后如何closures它?

这是我迄今为止想要做的事情:

  1. 在WM_CREATE上创build一个系统范围的钩子
  2. 当被捕获时,检查类和WM_CREATE目标的进程
  3. 确认它确实是我关心的窗口:
    • 如果这个过程是我的插件所在的那个
    • 如果class级是正确的types
    • 如果正确的应用程序是焦点(在多个应用程序的情况下)
  4. 将WM_DESTROY发送到创build的窗口,并在其位置创build自己的窗口

听起来怎么样? 假设确实没有API来处理工具提示,有什么我需要的更简单的方法吗?

谢谢!

PS标记为C ++ / C#,因为我打算用这两种语言编写它(C ++用于系统范围的钩子,C#用于其他任何东西)

如果您知道要阻止的窗口的类型,则可以简单地将其子类化并在您自己的WndProc处理该破坏。 在工具提示类上使用GetClassLongPtr()和GCL_WNDPROC ,使用SetClassLongPtr()和GCL_WNDPROC来设置你自己的WndProc并让WM_CREATE调用DestroyWindow(),然后调用旧的WndProc

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

你的插件系统需要明确支持替换工具提示,如果你想这个工作顺利。 也许插件框架的可选部分可能是一个RequestTooltip函数。 如果它不存在,或者返回null,或者使用默认工具提示,否则使用你提供的插件。