禁用WPF应用程序中的Aero Peek
我想在我的WPF应用程序中禁用Aero Peek(当用户将鼠标放在“显示桌面”按钮上时,我的应用程序必须可见)。我使用这个PInvoke签名:禁用WPF应用程序中的Aero Peek,wpf,pinvoke,dwm,aero-peek,Wpf,Pinvoke,Dwm,Aero Peek,我想在我的WPF应用程序中禁用Aero Peek(当用户将鼠标放在“显示桌面”按钮上时,我的应用程序必须可见)。我使用这个PInvoke签名: [Flags] public enum DwmWindowAttribute : uint { DWMWA_NCRENDERING_ENABLED = 1, DWMWA_NCRENDERING_POLICY, DWMWA_TRANSITIONS_FORCEDISABLED, DWMWA_ALLOW_NCPAINT,
[Flags]
public enum DwmWindowAttribute : uint
{
DWMWA_NCRENDERING_ENABLED = 1,
DWMWA_NCRENDERING_POLICY,
DWMWA_TRANSITIONS_FORCEDISABLED,
DWMWA_ALLOW_NCPAINT,
DWMWA_CAPTION_BUTTON_BOUNDS,
DWMWA_NONCLIENT_RTL_LAYOUT,
DWMWA_FORCE_ICONIC_REPRESENTATION,
DWMWA_FLIP3D_POLICY,
DWMWA_EXTENDED_FRAME_BOUNDS,
DWMWA_HAS_ICONIC_BITMAP,
DWMWA_DISALLOW_PEEK,
DWMWA_EXCLUDED_FROM_PEEK,
DWMWA_LAST
}
[Flags]
public enum DWMNCRenderingPolicy : uint
{
UseWindowStyle,
Disabled,
Enabled,
Last
}
[DllImport("dwmapi.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DwmIsCompositionEnabled();
[DllImport("dwmapi.dll", PreserveSig=false)]
public static extern Int32 DwmSetWindowAttribute(IntPtr hwnd,
DwmWindowAttribute dwmAttribute,
IntPtr pvAttribute,
uint cbAttribute);
[DllImport("dwmapi.dll", PreserveSig = true)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd,
DwmWindowAttribute dwmAttribute,
IntPtr pvAttribute,
uint cbAttribute);
这种用法:
var helper = new WindowInteropHelper(this);
helper.EnsureHandle();
if (API.DwmIsCompositionEnabled())
{
var status = Marshal.AllocCoTaskMem(sizeof(uint));
Marshal.Copy(new[] {(int) API.DWMNCRenderingPolicy.Enabled}, 0, status, 1);
API.DwmSetWindowAttribute(helper.Handle,
API.DwmWindowAttribute.DWMWA_EXCLUDED_FROM_PEEK,
status,
sizeof (uint));
}
在我的64位系统(Windows7 Professional)中,只有运行64位应用程序才能工作。如果在WOW64模式下运行32位应用程序,则会收到异常:
“对PInvoke函数'XXX::DwmSetWindowAttribute'的调用使堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。”
你觉得这个怎么样?解决方案是什么?我更改签名:
[Flags]
public enum DwmWindowAttribute : uint
{
DWMWA_NCRENDERING_ENABLED = 1,
DWMWA_NCRENDERING_POLICY,
DWMWA_TRANSITIONS_FORCEDISABLED,
DWMWA_ALLOW_NCPAINT,
DWMWA_CAPTION_BUTTON_BOUNDS,
DWMWA_NONCLIENT_RTL_LAYOUT,
DWMWA_FORCE_ICONIC_REPRESENTATION,
DWMWA_FLIP3D_POLICY,
DWMWA_EXTENDED_FRAME_BOUNDS,
DWMWA_HAS_ICONIC_BITMAP,
DWMWA_DISALLOW_PEEK,
DWMWA_EXCLUDED_FROM_PEEK,
DWMWA_LAST
}
[Flags]
public enum DWMNCRenderingPolicy : uint
{
UseWindowStyle,
Disabled,
Enabled,
Last
}
[DllImport("dwmapi.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DwmIsCompositionEnabled();
[DllImport("dwmapi.dll", PreserveSig=false)]
public static extern Int32 DwmSetWindowAttribute(IntPtr hwnd,
DwmWindowAttribute dwmAttribute,
IntPtr pvAttribute,
uint cbAttribute);
[DllImport("dwmapi.dll", PreserveSig = true)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd,
DwmWindowAttribute dwmAttribute,
IntPtr pvAttribute,
uint cbAttribute);
使用方法:
if (API.DwmIsCompositionEnabled())
{
var status = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(status, 1); // true
API.DwmSetWindowAttribute(helper.Handle,
API.DwmWindowAttribute.DWMWA_EXCLUDED_FROM_PEEK,
status,
sizeof(int));
}
可能的重复不是解决方案。当我使用任何调用约定时,我都会遇到异常或函数不起作用。@Alexander您能补充一下您的问题吗?您尝试了什么以及它是如何失败的?@ChrisWue我不明白。我已经详细描述了一个问题。您的问题是收到一个“不平衡堆栈”异常。原因是您需要使用Cdecl调用约定。现在你已经说过你已经试过了,但是这个函数不起作用。那么,它怎么不起作用呢?将Cdecl添加到dllimport后,您是否仍收到“不平衡堆栈”例外?