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

时间:2018-06-09 20:59:56

标签: c# winapi drawing desktop

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

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窗口设置为窗体的父窗口,我正在绘制此窗体,所以我只需要在它应该更改窗口或类似的东西时清除它。这是作为workerw window.的孩子创建的表单的图片 正如你们中的一些人所说,这并不是有意做的,那么有没有其他方法来制作动画壁纸? 谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

继@Barmak所说(因为我认为他没有这么做),以下应该做你想做的事:

HashMap

你必须自己将其翻译成C#,抱歉。我早上太早才能为自己解决这个问题。

应该工作的另一件事是破坏你的形式。然后父窗口将获得更新事件并相应地重绘自身。事实上,考虑一下,这可能是一种更好的方法。

答案 1 :(得分:0)

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

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