作为一个有趣的办公室项目,我们正在构建一个很酷的过渡背景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设置为零会自动选择桌面(最顶部)窗口。
答案 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。祝你好运。