我正在尝试使用API进行航空偷看.经过大量的挖掘和搜索,我偶然发现了这段代码:
[DllImport("dwmapi.dll", EntryPoint = "#113", SetLastError = true)]
internal static extern uint DwmpActivateLivePreview(uint , uint , uint , uint );
Run Code Online (Sandbox Code Playgroud)
但我不能让它工作..我不知道参数是什么..我尝试了一些API拦截工具,但没有成功.如何才能发现如何正确调用此API?
我想在我的WPF应用程序中禁用Aero Peek(当用户将鼠标放在"显示桌面"按钮上时,我的应用程序必须可见).我使用这个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);
Run Code Online (Sandbox Code Playgroud)
这个用法:
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); …Run Code Online (Sandbox Code Playgroud) 我从Windows API Code Pack中看到,可以在winforms应用程序中启用自定义玻璃,但是我无法确定如何让子窗口显示为aero peek的separte缩略图(以同样的方式IE将其选项卡的内容显示为单独的窗口)
是否可以从Winforms应用程序执行此操作,还是会涉及大量P/Invoke voodoo?