我正在桌面背景上绘制动画,但是在桌面背后的图层中。如图所示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.的孩子创建的表单的图片 正如你们中的一些人所说,这并不是有意做的,那么有没有其他方法来制作动画壁纸? 谢谢你的时间。
答案 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);
}