1

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

4

2 回答 2

3

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

除了编写一个以不同方式处理背景图像和桌面图标的外壳替换(一项具有许多障碍的主要开发任务)之外,我能想到的唯一其他选择是挂钩桌面的事件并拦截 WM_ERASEBKGND 或类似的东西来做你自己的绘图。(有关更多信息,请参阅此问题此问题。)

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

于 2013-02-15T02:09:40.467 回答
0

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

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

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

于 2014-12-23T10:58:48.483 回答