【问题标题】:How to put a form behind desktop icons?如何在桌面图标后面放置表格?
【发布时间】:2013-02-15 01:43:54
【问题描述】:

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

【问题讨论】:

  • 您可以将窗口保存为设置为桌面背景的位图,但我假设您想要一个工作应用程序,在这种情况下它是不可能的。
  • 这个的用例是什么?也许有更好的方法来实现同样的目标。

标签: c# winforms winapi icons desktop


【解决方案1】:

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

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

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

【讨论】:

  • 图标下有可以绘制的程序。所以这是可能的。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 2011-08-16
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多