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

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

我正在开发应用程序的(进程中)插件,作为插件的一部分,我想用我自己的工具提示替换应用程序的工具提示。但是,没有可供我执行此操作的 API,因此我决定使用低级别。

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

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

  1. 在 WM_CREATE 上创建一个系统范围的钩子(Hook)
  2. 捕获时,检查WM_CREATE目标的类和进程
  3. 验证它确实是我关心的窗口:
    • 如果进程是我的插件所在的进程
    • 如果类是正确的类型
    • 并且如果正确的应用程序处于焦点(在多个应用程序的情况下)
  4. 向创建的窗口发送 WM_DESTROY 并在其位置创建我自己的窗口

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

谢谢!

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

最佳答案

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

关于c# - 在窗口出现之前拦截并隐藏它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347803/

相关文章:

自 KB4338419 以来,无法再从经典 ASP 创建 C# COM 对象

c# - ListView 鼠标点击事件

c# - .NET FileInfo.LastWriteTime & FileInfo.LastAccessTime 是错误的

c++ - 如何在 C++ 中从 dll(dll 中的构造函数)创建一些类?

c++ - 从 std::vector 的前面删除项目时, 'compacting memory' 是什么意思?

python - 使用 Windows 复制对话框进行复制

c# - 用c#压缩avi视频

c++ - 是否确保保留对 volatile 结构的单独成员的写入顺序?

asp.net - Windows 应用程序与 Web 应用程序开发

c - 如何用c获取主板的uuid