如何将窗口“固定”到桌面?

时间:2009-12-13 07:27:25

标签: winapi

这个问题更具学术性而非实用性,不涉及任何一种特定语言。为了便于讨论,我们将使用Win32 API。

创建具有以下行为目标的窗口的最合适方法是什么:

  • Z-Order低于除桌面之外的所有其他窗口。
  • 通过鼠标或键盘点击,无法使其显示在比其他窗口更高的z顺序上。

可以假设窗口是无边框的。

1 个答案:

答案 0 :(得分:2)

这里有两种基本方法: -

  1. 让您的窗口成为桌面的“孩子”。
  2. 让您的窗口拒绝接受焦点或激活: -
  3. Windows窗口管理器的奇迹是没有一个。相反,由于系统中所有窗口的紧急行为,即窗口管理器的外观 - 即它们对消息的反应 - 在99%的情况下由DefWindowProc处理。

    这意味着您可以通过在DefWindowProc之前处理消息来破坏许多正常的窗口管理器类型行为。如果您创建一个窗口,并使用{-3}}的z顺序底部的相关标记来定位它,然后处理WM_WINDOWPOSCHANGING之类的消息,则可以确保您的窗口永远不会接收激活或焦点并且始终 - 即使其他应用程序调用SetWindowPos - 也始终设置了z-bottom标志。

    这两种方法都存在问题,因为很难找出桌面窗口是什么。 GetDesktopWindow返回一个窗口的句柄,该窗口只有在资源管理器崩溃时才可见。其余的时间,可见桌面是由资源管理器创建的窗口 - 最终是一个syslistview控件。 Spy ++ + Findwindow将为您提供您想要在上面的窗口的句柄。