如何始终保持窗口可见,但不强制它位于顶部

Posted

技术标签:

【中文标题】如何始终保持窗口可见,但不强制它位于顶部【英文标题】:How to keep window visible at all times, but not force it to be on top 【发布时间】:2016-01-27 18:18:19 【问题描述】:

我正在创建一个“桌面小工具”,我已经禁用了手动最小化窗口,但现在还有另一个问题:如果用户按下 Windows,系统仍然可以隐藏窗口>+D,例如。

以这种方式隐藏时,不会触发通常的最小化/调整大小/可见性事件。 我想做一些类似于TopMost 的事情,但不强制窗口顺序。

也许可以使用 win32 API 安装一个全局快捷方式事件,并将TopMost 设置为 true,但这听起来很 hackish。

我找到了一种解决方案,但它似乎不适用于 Windows 10:Keeping window visible through "Show Desktop"/Win+D 另一个常见的选项,即编写一个实际的桌面小工具,在 Windows 10 上是不可能的,因为它们已被弃用。

是否有任何其他方法可以让窗口始终可见(但不在屏幕顶部)?

【问题讨论】:

用户明确按下“显示我的桌面”的键盘命令;是什么让您确定他的真正意思是“向我展示我的桌面和这个小工具”。如果他有很多这样的小工具,而且都使用了比可用空间更多的屏幕空间,会发生什么? @SimonSvensson 我知道所有的可用性问题。此应用程序专为希望其行为完全相同的特定家庭用户开发。所述用户已经在他的 Windows 10 机器上安装了来自 Windows 7 的“便笺”,并且预计会有类似的行为。 是的,桌面小工具就是它所需要的。从 Windows 中删除。便笺不再粘,它也被最小化了。希望他们付给你足够的钱。 【参考方案1】:

这个功能对我有用:

BOOL FixShowDesktop(HWND hWnd)

    HWND hWndTmp = FindWindowEx(NULL, NULL, L"Progman", NULL);
    if (hWndTmp)
    
        hWndTmp = FindWindowEx(hWndTmp, NULL, L"SHELLDLL_DefView", NULL);
        if (hWndTmp)
        
            SetWindowLongPtr(hWnd, -8, (LONG_PTR)hWndTmp);
            return TRUE;
        
    
    return FALSE;

注意,这段代码比Keeping window visible through "Show Desktop"/Win+D 的代码要好一些,因为该窗口可能会被其他窗口溢出(就像任何其他窗口一样)。使用 SetParent 将窗口置于所有其他窗口之下。

【讨论】:

以上是关于如何始终保持窗口可见,但不强制它位于顶部的主要内容,如果未能解决你的问题,请参考以下文章

如何使Chrome扩展程序窗口始终位于顶部

在 IQKeyboardManager 中始终保持视图位于顶部(不要使用键盘滚动)

如何在滚动表格视图期间始终将表格视图的第一个单元格保持在其表格视图的顶部

如何让我最上面的窗口保持在顶部?

保持 uisearchbar 在 uitableview 中始终可见

查看大表格时,HTML 表格标题始终显示在窗口顶部