问题
I want to disable Aero Peek in my WPF application (my application must be visible when user placed the mouse over the button "Show desktop"). I use this PInvoke signature:
[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);
and this usage:
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));
}
In my 64-bit system (Windows 7 Professional), it's work only if I run 64-bit application. If I run 32-bit application in WOW64 mode, I receive exception:
"A call to PInvoke function 'XXX::DwmSetWindowAttribute' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature."
What do you think about this? What is the solution?
回答1:
I change the signature:
[DllImport("dwmapi.dll", PreserveSig = true)]
public static extern int DwmSetWindowAttribute(IntPtr hwnd,
DwmWindowAttribute dwmAttribute,
IntPtr pvAttribute,
uint cbAttribute);
and usage:
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));
}
来源:https://stackoverflow.com/questions/6160118/disable-aero-peek-in-wpf-application