WinForm Z索引到桌面

时间:2015-04-14 08:48:18

标签: c# winforms z-index

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

其中一个挑战是我们需要WinForm窗口位于桌面背景和图标之上,而不是任务栏。

是否有某种方法可以精确调整winform窗口的Z-Index,使其位于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 ++真的是一个了解窗口和子窗口结构的好工具。我们发现将IntPtr设置为零会自动选择桌面(最顶部)窗口。

1 个答案:

答案 0 :(得分:2)

下载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 8,请记住很多人在他们的机器上安装了ClassicShell。祝你好运。