我想对我的Windows桌面进行一些自定义绘图,以便它可以替换桌面背景(壁纸)。我的第一次尝试是获得desktopListView
的DC并吸引它:
IntPtr desktopDC = GetWindowDC(desktopListView);
Graphics g = Graphics.FromHwnd(desktopDC); //<-- fails on out of memory error
然后我尝试创建一个NativeWindow并通过将本机窗口的句柄分配给桌面来捕获WM_PAINT
消息并自己绘制,但我无法看到任何消息到桌面。
理想情况下,我想在WPF中执行此操作,而不是在Windows窗体中执行此操作。任何线索如何创建一个我可以绘制的WPF窗口,它位于桌面图标下方,但在壁纸之上,它忽略了任何鼠标消息,桌面继续正常工作?
答案 0 :(得分:2)
如果获得桌面的窗口句柄,则可以创建一个新窗口并添加自己的自定义窗口作为其子窗口。把它放在列表视图后面可能会给你你需要的结果,虽然我不能100%确定透明度的效果如何。
找到一些代码 - 如果您不需要处理多个改变形状的屏幕,那么您需要的大部分内容都在第一部分。
public void SetDesktopWindows()
{
Thread.Sleep(0);
while (this.Count < Screen.AllScreens.Length)
{
OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = new OrangeGuava.Desktop.DesktopWindow.DesktopControl();
User32.SetParent(dtc.Handle, User32.FindWindow("ProgMan", null));
this.Add(dtc);
}
int minx = 0;
int miny = 0;
foreach (Screen screen in Screen.AllScreens)
{
if (screen.Bounds.Left < minx) minx = screen.Bounds.Left;
if (screen.Bounds.Top < miny) miny = screen.Bounds.Top;
}
for (int i = Screen.AllScreens.Length; i < Count; i++)
{
OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = (OrangeGuava.Desktop.DesktopWindow.DesktopControl)this[i];
dtc.Hide();
}
for (int i = 0; i < Screen.AllScreens.Length; i++)
{
OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = (OrangeGuava.Desktop.DesktopWindow.DesktopControl)this[i];
dtc.DeviceId = i.ToString();
Rectangle r = Screen.AllScreens[i].WorkingArea;
r.X -= minx;
r.Y -= miny;
dtc.SetBounds(r.X, r.Y, r.Width, r.Height);
dtc.displaySettingsChanged(null, null);
}
}
答案 1 :(得分:1)
我通过设置WM_WINDOWPOSCHANGING
让我的窗口响应WINDOWPOS.hWndInsertAfter = HWND_BOTTOM
消息来完成此操作。这告诉操作系统:确保我的窗口位于所有其他窗口的下方,并使其看起来好像您的窗口粘在桌面上。