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 结构的好工具。我们发现将 IntPtr 设置为零会自动使其 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。祝你好运。
作为一个有趣的办公项目,我们正在构建一个很酷的过渡背景 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 结构的好工具。我们发现将 IntPtr 设置为零会自动使其 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。祝你好运。