我如何绘制或添加自定义button到所有应用程序的每个窗口?

我已经看到了几个工具在Windows中的所有应用程序的所有窗口的标题栏上添加自定义button和/或绘图。 这是怎么做的? delphi的一个例子的额外点。

编辑:我发现了一些dotNET这样做: http : //www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html#.VdmioEDenqQ

我没有这样做,所以下面是我会调查,如果我想尝试:

  • 对于每个应用程序/ 每个顶层窗口 :
  • 创建一个浮动窗口,并将其放置在标题栏上的任何位置。 设置父母/子女的关系 ,但这个窗口是你自己的过程的一部分。 (偶尔有一个窗口从一个进程到另一个进程的问题,但是尽量避免注入其他进程。)
  • 你可以调查窗口标志,看看窗口是否有一个标题栏(即如果你应该添加一个按钮)通过GetWindowLongGWL_STYLE寻找GWL_STYLE 。 同样的调用也可以让你看到字幕/帧的类型,你可以结合GetSystemMetrics与例如SM_CYDLGFRAME来找出你的按钮在这个特定窗口的标题栏上的大小。
  • 这个窗口现在是你的按钮:油漆,处理点击等适当的。
  • 使它成为一个不可调焦的窗口,这样点击它就不会把焦点从窗口的标题栏中移除。 例如,您不希望单击它来使标题栏更改颜色。 通过设置WS_EX_NOACTIVATE窗口标志,如下所示: SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE )
  • 主要的问题是在窗口移动,调整大小等时保持其正确定位。为此, 请为系统移动事件安装一个钩子 。 您还可以通过EVENT_SYSTEM_MINIMIZESTARTEVENT_SYSTEM_MINIMIZEEND最小化和恢复。 这将允许您跟踪屏幕上移动的所有窗口,以便您可以根据需要调整按钮窗口的位置。

这给你一个窗口,你可以画一个按钮(和响应点击等),视觉上“附加”到其他窗口,因此它保持在与用户拖动标题栏相同的地方,最大限度地减少或最大化的应用程序,这是在你自己的过程中没有跨进程问题。

我如何看待这个工作:

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