繁体   English   中英

通过“显示桌面”/Win+D 保持 window 可见

[英]Keeping window visible through "Show Desktop"/Win+D

我正在创建一个桌面小工具,但遇到了问题。 window 将被“显示桌面”命令隐藏 - 停止,我知道你在想什么,不需要“你不应该这样做”的评论 - 我想停止它。 毕竟,桌面小工具的全部意义在于它可以固定在桌面上。

只是为了澄清 - 我不想要 TopMost window。我不想真正停止“显示桌面”命令,只是忽略它。 我只想让我的桌面小工具在桌面上保持可见,尽可能少地破坏正常功能。

有任何想法吗? 我当前的方法是我在 Google 上找到的 P/Invoke 片段,将表单的父级设置为 Progman 或其他。 问题是这似乎强制在任务栏中显示 window,这是我不想要的。

回答你的问题可能有点晚了,但我似乎找到了答案:

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW);

    void MakeWin()
    {
        IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
        nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
        SetParent(Handle, nWinHandle);
    }

“MakeWin”应在窗体的构造函数中调用,最好在“InitializeComponent”之前调用。 至少在 Win7 下对我有用。

编辑:这不适用于 Windows 11,因为 Win+D 的行为似乎已经改变。

为 WPF forms 添加我的扭曲。由于 WPF window 句柄,上述代码不起作用。 完整代码适用于 WPF(win 10):

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW);

void MakeWin()
{
    IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
    nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
    var interop = new WindowInteropHelper(this);
    interop.EnsureHandle();
    interop.Owner = nWinHandle;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM