如何将表单放在桌面图标后面?

时间:2013-02-15 01:43:54

标签: c# winforms winapi icons desktop

你如何将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,它就会消失,大概是在壁纸背后。我怎么能让表单在图标和桌面背景之间?

2 个答案:

答案 0 :(得分:3)

我不相信这是可能的。桌面窗口是一个窗口,用于呈现桌面图像和图标,因此无法在桌面图像和图标之间插入窗口。

没有写一个处理背景图像和桌面图标的shell替代品(一个有许多障碍的主要开发任务),我能想到的唯一其他选择是挂钩桌面的事件并拦截WM_ERASEBKGND或类似的做你的自己的画。 (有关详细信息,请参阅this questionthis question。)

不幸的是,这不会让你把WinForm放在图标后面,只有图像。您必须处理许多其他Windows消息以模拟实际表单。无论如何,这都是一项重大任务。

答案 1 :(得分:0)

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

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

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