Атрибут DwmSetWindowAttribute не работает с DWMWA_CLOAK - PullRequest
0 голосов
/ 21 марта 2019

Я недавно начал использовать Windows API нижнего уровня с C # для прототипа приложения, и наткнулся на проблему, с которой не могу разобраться: рассмотрим следующий фрагмент кода:

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)));
    }
}

Учтите, что дескриптор четко определен IntPtr. Я пытаюсь скрыть окно, используя DwmSetWindowAttribute, но по какой-то странной причине оно никогда не работает (окно остается видимым все время), и результат (сохраненный в hr) всегда равен -2147024891. Я просто не понимаю, почему это происходит, так как код кажется правильным (imho). У тебя есть какие-нибудь подсказки?

Спасибо

1 Ответ

0 голосов
/ 09 июля 2019

Я получил тот же результат (доступ запрещен), даже с администратором, и я выяснил, что только системная оболочка и само приложение могут устанавливать плащ, стороннему процессу будет отказано.

...