Как очистить нарисованные объекты на фоне рабочего стола? - PullRequest
0 голосов
/ 09 июня 2018

Я рисую анимацию на фоне рабочего стола, но в слое за иконками рабочего стола.Как показано здесь. Я получаю рабочее окно с этим кодом:

IntPtr progman = IntPtr.Zero;
        IntPtr workerw = IntPtr.Zero;
        IntPtr dc = IntPtr.Zero;

        progman = W32.FindWindow("Progman", null);
        UIntPtr result = UIntPtr.Zero;
        W32.SendMessageTimeout(progman, 0x052C, new UIntPtr(0), IntPtr.Zero, W32.SendMessageTimeoutFlags.SMTO_NORMAL, 1000, out result);
        W32.EnumWindows(new W32.EnumWindowsProc((tophandle, topparamhandle) =>
        {
            IntPtr p = W32.FindWindowEx(tophandle, IntPtr.Zero, "SHELLDLL_DefView", "");
            listview = p;
            if (p != IntPtr.Zero)
            {
                workerw = W32.FindWindowEx(IntPtr.Zero, tophandle, "WorkerW", "");
            }
            return true;
        }), IntPtr.Zero);
        dc = W32.GetDCEx(workerw, IntPtr.Zero, (W32.DeviceContextValues)0x403);
        if (dc != IntPtr.Zero)
        {
           Graphics g = Graphics.FromHdc(dc);
        }

Рисование в этом окне (графика) работает нормально, но я не могу очистить нарисованные объекты.Я на самом деле устанавливаю окно работника в качестве родителя формы, и я рисую эту форму, поэтому мне просто нужно очистить его, когда оно должно изменить окно или что-то в этом роде.Вот изображение формы, созданной как дочерний элемент окна workerw. Как некоторые из вас сказали, что это не предназначено, так есть ли альтернативы для создания анимированных обоев?Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Если кто-то заинтересован в ответе.Мне не нужно очищать его очень часто, поэтому я просто получаю текущие обои и устанавливаю их заново.Вот код:

public static void clearDesktop()
    {
        SetDesktopWallpaper(GetDesktopWallpaper());
    }

    private static readonly int MAX_PATH = 260;
    private static readonly int SPI_GETDESKWALLPAPER = 0x73;
    private static readonly int SPI_SETDESKWALLPAPER = 0x14;
    private static readonly int SPIF_UPDATEINIFILE = 0x01;
    private static readonly int SPIF_SENDWININICHANGE = 0x02;

    static string GetDesktopWallpaper()
    {
        string wallpaper = new string('\0', MAX_PATH);
        W32.SystemParametersInfo(SPI_GETDESKWALLPAPER, wallpaper.Length, wallpaper, 0);
        return wallpaper.Substring(0, wallpaper.IndexOf('\0'));
    }

    static void SetDesktopWallpaper(string filename)
    {
        W32.SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, filename,
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
    }
0 голосов
/ 10 июня 2018

Исходя из того, что сказал @ Бармак (потому что я не думаю, что он понял это правильно), следующее должно делать то, что вы хотите:

InvalidateRect (workerw, NULL, TRUE);

Вам придется перевести это на C #себя, извини.Слишком рано для меня, чтобы понять это для себя.

Другая вещь, которая должна работать, должна разрушить вашу форму.Затем родительское окно получит событие обновления и соответствующим образом перерисовает себя.На самом деле, если подумать, это, вероятно, лучший подход.

...