Я хочу отключить Aero Peek в своем приложении WPF (мое приложение должно быть видно, когда пользователь наводит указатель мыши на кнопку «Показать рабочий стол»).Я использую эту подпись 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);
и это использование:
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-разрядной системе (Windows 7 Professional) она работает только при запуске 64-разрядного приложения,Если я запускаю 32-разрядное приложение в режиме WOW64, я получаю исключение:
"При вызове функции PInvoke 'XXX :: DwmSetWindowAttribute' разбалансирован стек. Вероятно, это происходит из-за того, что управляемая подпись PInvoke делаетне соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи. "
Что вы думаете об этом?Какое решение?