Немедленно применить изменения к диспетчеру окон

В настоящее время я пытаюсь написать программу на C #, которая изменяет цвет активного окна в диспетчере окон рабочего стола Windows 8. Я выделил запись реестра, содержащую конкретное значение, и изменил ее на значение по своему выбору.

Сейчас я пытаюсь добиться немедленного изменения цвета без перезапуска оконного менеджера (по-немецки «desktopfenster manager» - не знаю точно английского названия процесса).

Вот код для изменения значения:

RegistryKey key;
public void initialise()
    {
        key = Registry.CurrentUser;
        key = key.OpenSubKey("Software\\Microsoft\\Windows\\DWM",true);
        Object theValue = key.GetValue("ColorizationColor", RegistryValueKind.DWord);
        System.Console.Write("Value before switch: ");
        System.Console.WriteLine(String.Format("{0:X}", theValue));


        System.Console.ReadKey();
    }

    public void setColor()
    {
        key.SetValue("ColorizationColor", unchecked((int) 0xff00ff00u), RegistryValueKind.DWord);
        Object theValue = key.GetValue("ColorizationColor", RegistryValueKind.DWord);
        System.Console.Write("Value after switch: ");
        System.Console.WriteLine(String.Format("{0:X}", theValue));

        System.Console.ReadKey();



    }

Теперь я пытаюсь отправить широковещательное сообщение диспетчеру окон, чтобы заставить его обновить свой статус. К сожалению, я никогда не работал с ним и не могу понять, что именно делать.

Google говорит мне, что я должен определить

 [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessageTimeout(
        IntPtr hWnd,
        int Msg,
        IntPtr wParam,
        string lParam,
        int fuFlags,
        int uTimeout,
        IntPtr lpdwResult
    );

А затем вызовите его в моей функции следующим образом:

 SendMessageTimeout((IntPtr)0xffff, 0x001A, IntPtr.Zero, "Environment",
                2, 5000, IntPtr.Zero);

Это не работает, к тому же я все равно не знаю, на правильном ли я пути. Однако цвет меняется после повторного входа в мою учетную запись пользователя.

Ах, я должен добавить, что в итоге программа должна случайным образом изменить цвет окна, изменив значение

HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColor

получить своеобразное «Радужное окно».

Я также дал

HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ColorizationColorBalance

альфа-значение 00 (в то время как ColorizationColor имеет ff в начале)


person Lézard    schedule 13.05.2014    source источник
comment
msdn.microsoft.com/ en-us / library / windows / desktop /   -  person Hans Passant    schedule 13.05.2014
comment
Не могли бы вы привести мне пример? Я управлял частью, которая устанавливает значение реестра, но похоже, что эта функция WM_DWMCOLORIZATIONCOLORCHANGED делает ненужным редактирование реестра. Однако я понятия не имею, как использовать эту функцию с SendMessageTimeout. Возможно, я упускаю суть, API выглядит довольно утомленным, так как я не опытный программист Windows ...   -  person Lézard    schedule 14.05.2014
comment
Возможный дубликат Как Windows меняет цвет Aero Glass?   -  person Cees Timmerman    schedule 31.07.2016