首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使WPF窗口忽略显示桌面(Win+D)

使WPF窗口忽略显示桌面(Win+D)
EN

Stack Overflow用户
提问于 2022-04-17 15:57:02
回答 2查看 218关注 0票数 -2

因此,关于这个主题已经有了各种各样的问题(从4-5年前开始),我按照这些问题提出了以下解决方案,以避免我的窗口对Win+D (显示桌面)命令做出反应:

代码语言:javascript
复制
public partial class MainWindow : Window
{

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

    public MainWindow()
    {
        InitializeComponent();
        Loaded += OnWindowLoaded;
    }

    private void OnWindowLoaded(object sender, RoutedEventArgs e)
    {
        IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
        nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
        SetParent(new WindowInteropHelper(this).Handle, nWinHandle);
    }
}

然而,这似乎不适用于我(上面的代码在一个全新的项目中)。

有谁能解释一下WinAPI是否有任何变化,这是否仍然有效?这是我在这个话题上找到的几乎每一个问题的答案。

我在跑步:

  • 版: Windows 10 Pro
  • 版本: 21H2
  • 建造: 19044.1645
  • 体验: Windows功能体验包120.2212.4170.0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-18 09:37:05

好的,我找到了对我有用的解决方案,我知道将窗口设置为桌面的子程序有它的问题/风险,但是对于仍然需要这样做的人,下面是我发现的:

"SHELLDLL_DefView“桌面窗口并不总是"Progman”的子窗口,有时它是"WorkerW“窗口的子窗口。这就是为什么我最初问题中的代码对我无效的原因。

因此,您不需要找到"Progman“窗口和"SHELLDLL_DefView”子窗口,而是需要从所有窗口中枚举,并找到作为子窗口具有"SHELLDLL_DefView“的窗口。

这是用EnumWindows函数(https://www.pinvoke.net/default.aspx/user32.enumwindows)完成的。

下面的代码是上面pinvoke.net链接中的一个示例的混搭,下面是两个答案:

代码语言:javascript
复制
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, 
    string sW);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList 
    lParam);

    public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

    public static bool GetWindowHandle(IntPtr windowHandle, ArrayList 
    windowHandles)
    {
        windowHandles.Add(windowHandle);
        return true;
    }

    private void SetAsDesktopChild() 
    {
        ArrayList windowHandles = new ArrayList();
        EnumedWindow callBackPtr = GetWindowHandle;
        EnumWindows(callBackPtr, windowHandles);

        foreach (IntPtr windowHandle in windowHandles)
        {
            IntPtr hNextWin = FindWindowEx(windowHandle, IntPtr.Zero,     
            "SHELLDLL_DefView", null);
            if (hNextWin != IntPtr.Zero)
            {
                var interop = new WindowInteropHelper(_window);
                interop.EnsureHandle();
                interop.Owner = hNextWin;
            }
        }
    }

现在,在显示桌面/Win+D之后,我的WPF仍然停留在桌面上。

票数 0
EN

Stack Overflow用户

发布于 2022-04-17 17:21:57

有些Windows操作不能被开发人员覆盖,例如:

  • 总是在主任务栏上显示托盘图标
  • 重写Win+D以始终在桌面上显示窗口
  • 强制总是显示通知

这些是Windows操作系统的策略,以确保用户始终处于控制之中,而不是开发人员。

尽管如此,您可以尝试另一种方法,使您的“小部件”可见。请允许我提出以下建议:

在我看来,显示你的小部件的1秒延迟对你的用户体验来说是一个小的代价。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71903355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档