如何清除桌面背景上绘制的对象?

How to clear drawn objects on the desktop background?

我正在桌面背景上绘制动画,但在桌面图标后面的图层中。如图here. 我正在使用此代码获取 workerw window:

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

在此 window(图形)上绘图效果很好,但我无法清除绘制的对象。我实际上将 workerw window 设置为表单的父级,并且我正在绘制此表单,所以我只需要在它应该更改 window 或类似内容时清除它。这是作为 workerw window. 的子项创建的表单的图片 正如你们中的一些人所说,这不是故意的,那么有没有其他方法可以创建动画壁纸? 谢谢你的时间。

根据@Barmak 所说的(因为我认为他说的不太对),下面应该做你想做的:

InvalidateRect (workerw, NULL, TRUE);

抱歉,您必须自己将其翻译成 C#。现在早上太早了,我自己想不通。

另一件应该起作用的事情是破坏你的形式。然后父 window 将获得更新事件并相应地重绘自身。其实想想,这可能是更好的做法。

如果有人有兴趣回答。我不必经常清除它,所以我只是获取当前壁纸并重新设置。这是代码:

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('[=10=]', MAX_PATH);
        W32.SystemParametersInfo(SPI_GETDESKWALLPAPER, wallpaper.Length, wallpaper, 0);
        return wallpaper.Substring(0, wallpaper.IndexOf('[=10=]'));
    }

    static void SetDesktopWallpaper(string filename)
    {
        W32.SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, filename,
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
    }