如何将窗体放在桌面图标后面

本文关键字:桌面 图标 窗体 | 更新日期: 2023-09-27 17:59:41

如何将WinForms表单放在桌面图标后面而放在壁纸前面?为了使桌面成为窗体的父级,我使用:

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    IntPtr desktopHandle = (IntPtr)FindWindow("Progman", null);
    WallForm wallWindow = new WallForm();//WinForms Form
    ...
    private void SwitchParent()
    {
        wallWindow.Show();
        SetParent(wallWindow.Handle, desktopHandle);
        //wallWindow.SendToBack();
    }

这是有效的,但它将表单放在桌面图标的前面。如果我在表单上调用SendToBack,它就会消失,大概在壁纸后面。我如何才能使表单位于图标和桌面背景之间?

如何将窗体放在桌面图标后面

我认为这是不可能的。桌面窗口是一个渲染桌面图像和图标的单一窗口,因此没有办法在桌面图像和图像之间插入窗口。

除了编写一个以不同方式处理背景图像和桌面图标的外壳替换程序(这是一项有很多障碍的主要开发任务)之外,我唯一能想到的其他选择就是挂接到桌面的事件中,截取WM_ERASEBKGND或类似程序来绘制自己的图形。(请参阅此问题或此问题了解更多信息。)

不幸的是,这不会让你在图标后面放一个WinForm,只有一个图像。你必须处理许多其他的windows消息来模拟一个实际的表单。不管怎样,这都是一项重大任务。

这个问题有一个解决方案,至少适用于Windows 8。我以一篇关于CodeProject的文章的形式发布了它,所以你可以在这里阅读:

http://www.codeproject.com/Articles/856020/Draw-behind-Desktop-Icons-in-Windows

这适用于简单的绘图、windows窗体、wpf、directx等。该文章中提供的解决方案仅适用于windows 8。