如何在所有应用程序的每个窗口中绘制或添加自定义按钮?

dum*_*uch 7 windows delphi winapi

我见过几个工具在Windows的所有应用程序的所有窗口的标题栏上添加自定义按钮和/或绘图.怎么做的?Delphi中的一个例子的额外点.

编辑:我发现dotNET的东西是这样的:http: //www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html#.VdmioEDenqQ

Ale*_*rov 5

我对这份工作的看法:

  1. 首先,我们应该能够在我们自己的窗口标题上绘制这个按钮。后面会用到这个程序
  2. 这部分程序枚举了活动和可见的窗口
  3. 这部分程序使用注入将我们的​​ dll 附加到枚举窗口
  4. 从注入的 dll 中,我们可以在窗口标题上绘制按钮
  5. 在这个 dll 中,我们应该处理按钮的点击
  6. 我们应该有机制将结果发送到我们的主程序


Dav*_*vid 3

我还没有这样做过,所以如果我尝试的话,我会调查以下内容:

  • 对于每个应用程序/每个顶级窗口
  • 创建一个浮动窗口并将其放置在标题栏上您想要放置的位置。 设置父/子关系,但此窗口是您自己的进程的一部分。(将一个窗口从一个进程设置为另一个进程的窗口时偶尔会出现问题,但请尝试。如果可能的话,我会避免注入其他进程。)
  • GetWindowLong您可以通过GWL_STYLE查找来WS_CAPTION调查窗口标志以查看窗口是否有标题栏(即是否应该添加按钮)。相同的调用还可以让您看到标题/框架的类型,您可以将其结合起来GetSystemMetrics,例如SM_CYDLGFRAME找出该特定窗口标题栏上按钮的正确大小。
  • 该窗口现在是您的按钮:绘画、处理点击等(视情况而定)。
  • 使其成为不可聚焦的窗口,以便单击它时不会将焦点从窗口的标题栏上移开。例如,您不希望单击它来使标题栏改变颜色。通过设置WS_EX_NOACTIVATE窗口标志来做到这一点,例如:。SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) orWS_EX_NOACTIVATE)
  • 主要问题是当窗口移动、调整大小等时保持其正确定位。为此,请为系统移动事件安装一个钩子。您还可以通过EVENT_SYSTEM_MINIMIZESTARTEVENT_SYSTEM_MINIMIZEEND挂钩最小化和恢复。这将允许您跟踪屏幕上移动的所有窗口,以便您可以在必要时调整按钮窗口位置。

这为您提供了一个窗口,您可以将其绘制为按钮(并响应点击等),该窗口在视觉上“附加”到其他窗口,因此当用户拖动标题栏、最小化或最大化应用程序时,它保持在同一位置,等等,这是在你自己的进程中,没有跨进程问题。