【问题标题】:How to make 'always-on-bottom'-window如何制作“始终在底部”窗口
【发布时间】:2009-02-09 12:29:44
【问题描述】:

有人知道如何制作“始终在底部”的窗口,或固定在桌面上的窗口吗?它应该接收焦点和鼠标点击,但应该保持在 Z 顺序的底部。如果在用户进行全部最小化或显示桌面操作时,它也能留在桌面上,那就太好了。

delphi 和 c# 解决方案(或部分解决方案/提示)都很棒。

【问题讨论】:

  • 如果可能你应该使用 Delphi 以外的其他东西,因为隐藏的应用程序窗口和主窗口之间的交互会使事情变得更加复杂。其中大部分是 forms.pas 中的私有内容,很难更改。
  • 使用 Show Desktop 时无法实现。但是,可以在使用 Minimize All 时 - 通过将 MinimizeBox 属性设置为 false,您将禁用表单的最小化。
  • @mghie:我不明白为什么应该避免使用 Delphi。建议的解决方案工作正常,并且只包含两行代码。我对你的评论投了-1 :-)
  • 无论如何,我很高兴它对你有用。也许您可以在上下文中添加一个包含这两行的简短示例的答案?

标签: c# delphi


【解决方案1】:

警告 建议您可以通过调用 SetParent 并将窗口设置为桌面的子窗口来完成此操作。如果你这样做,你会导致 Win32 窗口管理器将桌面的输入队列合并到你的子窗口,这是一个坏事 - Raymond Chen explains why.

另外,请记住,使用 HWND_BOTTOM 调用 SetWindowPos 是不完整的。每当您的窗口更改 zorder 时,您都需要执行此操作。处理 WM_WINDOWPOSCHANGING 事件,查看 SWP_NOZORDER 了解更多信息。

【讨论】:

    【解决方案2】:

    SetWindowPos 可以使窗口 AlwaysOnTop。它很可能会给出相反的结果。尝试以下方式:

    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
       int Y, int cx, int cy, uint uFlags);
    
    
     public const uint SWP_NOSIZE          = 0x0001;
     public const uint SWP_NOMOVE          = 0x0002;
     public const uint SWP_NOACTIVATE      = 0x0010;
     public const int HWND_BOTTOM = 1;
    
    
    SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
    

    注意:

    • 尚未测试此方法(用于使窗口始终位于底部)
    • 如果它恰好工作,那么很可能显示桌面操作将隐藏窗口。所以也许您应该更深入地了解这个“不错”的 API。

    编辑:按照这些思路进行了一些搜索,以确认它是否可以解决问题并发现一些有趣的东西 - a duplicate

    【讨论】:

    • +1 链接到另一个 SO 问题,它应该包含启动 OP 的所有内容。
    【解决方案3】:

    这是 ATL 窗口的解决方案。 如果能申请c#,对你有帮助。


    BEGIN_MSG_MAP(...)
       ...
       MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging)
       ...
    END_MSG_MAP()
    
    LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    
    {
    
        if (_bStayOnBottom)
        {
            auto pwpos = (WINDOWPOS*)lParam;
    
            pwpos->hwndInsertAfter = HWND_BOTTOM;
    
            pwpos->flags &= (~SWP_NOZORDER);
    
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多