如何清除桌面背景上绘制的对象?
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);
}
我正在桌面背景上绘制动画,但在桌面图标后面的图层中。如图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);
}