因此,关于这个主题已经有了各种各样的问题(从4-5年前开始),我按照这些问题提出了以下解决方案,以避免我的窗口对Win+D (显示桌面)命令做出反应:
public partial class MainWindow : Window
{
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW);
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
public MainWindow()
{
InitializeComponent();
Loaded += OnWindowLoaded;
}
private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
SetParent(new WindowInteropHelper(this).Handle, nWinHandle);
}
}然而,这似乎不适用于我(上面的代码在一个全新的项目中)。
有谁能解释一下WinAPI是否有任何变化,这是否仍然有效?这是我在这个话题上找到的几乎每一个问题的答案。
我在跑步:
发布于 2022-04-18 09:37:05
好的,我找到了对我有用的解决方案,我知道将窗口设置为桌面的子程序有它的问题/风险,但是对于仍然需要这样做的人,下面是我发现的:
"SHELLDLL_DefView“桌面窗口并不总是"Progman”的子窗口,有时它是"WorkerW“窗口的子窗口。这就是为什么我最初问题中的代码对我无效的原因。
因此,您不需要找到"Progman“窗口和"SHELLDLL_DefView”子窗口,而是需要从所有窗口中枚举,并找到作为子窗口具有"SHELLDLL_DefView“的窗口。
这是用EnumWindows函数(https://www.pinvoke.net/default.aspx/user32.enumwindows)完成的。
下面的代码是上面pinvoke.net链接中的一个示例的混搭,下面是两个答案:
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC,
string sW);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList
lParam);
public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);
public static bool GetWindowHandle(IntPtr windowHandle, ArrayList
windowHandles)
{
windowHandles.Add(windowHandle);
return true;
}
private void SetAsDesktopChild()
{
ArrayList windowHandles = new ArrayList();
EnumedWindow callBackPtr = GetWindowHandle;
EnumWindows(callBackPtr, windowHandles);
foreach (IntPtr windowHandle in windowHandles)
{
IntPtr hNextWin = FindWindowEx(windowHandle, IntPtr.Zero,
"SHELLDLL_DefView", null);
if (hNextWin != IntPtr.Zero)
{
var interop = new WindowInteropHelper(_window);
interop.EnsureHandle();
interop.Owner = hNextWin;
}
}
}现在,在显示桌面/Win+D之后,我的WPF仍然停留在桌面上。
发布于 2022-04-17 17:21:57
有些Windows操作不能被开发人员覆盖,例如:
这些是Windows操作系统的策略,以确保用户始终处于控制之中,而不是开发人员。
尽管如此,您可以尝试另一种方法,使您的“小部件”可见。请允许我提出以下建议:
在我看来,显示你的小部件的1秒延迟对你的用户体验来说是一个小的代价。
https://stackoverflow.com/questions/71903355
复制相似问题