WinForm ZIndex 到桌面

WinForm ZIndex to Desktop

作为一个有趣的办公项目,我们正在构建一个很酷的过渡背景 Winform 的应用程序来替换标准 windows 桌面背景。

挑战之一是我们需要将 WinForm window 置于桌面背景和图标之上,而不是任务栏之上。

有什么方法可以精确调整 winform window 的 Z 索引,使其位于 windows 桌面之上,但仍然允许任务栏和其他 windows坐在上面?


感谢您协助完成这项工作。以下对我们有用。

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

    const short SWP_NOMOVE = 0X2;
    const short SWP_NOSIZE = 1;
    const short SWP_NOZORDER = 0X4;
    const int SWP_SHOWWINDOW = 0x0040;

用法如下

        // Our desktop is the top most window.  
        IntPtr desktop = new IntPtr(0);
        // The running form we are testing this code with.
        IntPtr form1 = System.Windows.Forms.Application.OpenForms[0].Handle;
        // So we're setting our window Z-index to that of the desktop, 
        // but we setting flags for showing the window and then not not moving and resizing it.            
        SetWindowPos(form1, desktop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);

Spy++ 确实是学习 windows 和子 windows 结构的好工具。我们发现将 In​​tPtr 设置为零会自动使其 select 桌面(最顶部)window。

下载spy++ http://mdb-blog.blogspot.com/2010/11/microsoft-spy-or-spyxx-for-download.html 然后分别查看桌面句柄和开始菜单句柄是什么。这只是为了稍后进行概念验证,您必须找到一种更好的处理方式。使用 P\Invoke 调用你可以获得那些 windows z-order

int GetZOrder(IntPtr hWnd)
{
    var z = 0;
    for (IntPtr h = hWnd; h != IntPtr.Zero; h = GetWindow(h, 3)) z++;
    return z;
} 

该代码是从这个问题中复制的 How to get the z-order in windows?

然后您可以使用 SetWindowPos https://msdn.microsoft.com/en-us/library/windows/desktop/ms633545%28v=vs.85%29.aspx 将您自己的 windows 准确定位到您想要的位置。如果您正在使用 windows 8 请记住,很多人都在他们的机器上安装了 ClassicShell。祝你好运。