gpt4 book ai didi

c# - WinForm ZIndex 到桌面

转载 作者:行者123 更新时间:2023-11-30 16:55:21 27 4
gpt4 key购买 nike

作为一个有趣的办公项目,我们正在构建一个很酷的过渡背景 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++ 确实是了解窗口和子窗口结构的好工具。我们发现将 In​​tPtr 设置为零将自动使其选择桌面(最顶部)窗口。

最佳答案

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

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。祝你好运。

关于c# - WinForm ZIndex 到桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com