你如何将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,它就会消失,大概是在壁纸背后。我怎么能让表单在图标和桌面背景之间?
答案 0 :(得分:3)
我不相信这是可能的。桌面窗口是一个窗口,用于呈现桌面图像和图标,因此无法在桌面图像和图标之间插入窗口。
没有写一个处理背景图像和桌面图标的shell替代品(一个有许多障碍的主要开发任务),我能想到的唯一其他选择是挂钩桌面的事件并拦截WM_ERASEBKGND或类似的做你的自己的画。 (有关详细信息,请参阅this question或this 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.