DwmSetWindowAttribute不适用于DWMWA_CLOAK

时间:2019-03-21 02:56:32

标签: c# windows-10 pinvoke dwm

我最近开始使用带有C#的较低级别的Windows APIsn作为应用程序原型,但偶然发现一个我无法解决的问题:请考虑以下代码:

public class dW
{
    [DllImport("dwmapi.dll")]
    public static extern int DwmSetWindowAttribute(IntPtr hwnd, DwmWindowAttribute dwAttribute, ref int pvAttribute, int cbAttribute);

    [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_CLOAK,
        DWMWA_CLOAKED,
        DWMWA_FREEZE_REPRESENTATION,
        DWMWA_LAST
    }

    public IntPtr Handle { get; private set; }

    public void HideWindow()
    {
        int value = 0x01;
        int hr  = DwmSetWindowAttribute(Handle, DwmWindowAttribute.DWMWA_CLOAK, ref value, Marshal.SizeOf(typeof(int)));
    }
}

请考虑Handle是定义明确的IntPtr。我正在尝试使用DwmSetWindowAttribute隐藏窗口,但出于某些奇怪的原因,它永远无法工作(窗口始终保持可见),并且结果(存储在hr中)始终为-2147024891。我根本不明白为什么会这样,因为代码似乎是正确的(恕我直言)。 你有什么线索吗?

谢谢

1 个答案:

答案 0 :(得分:0)

即使使用Admin,我也得到相同的结果(访问被拒绝),并且我发现只有系统外壳和应用程序本身才能设置披风,第三方进程也将被拒绝。