在桌面上替换桌面墙纸/绘图

时间:2009-05-07 14:58:24

标签: wpf windows desktop wallpaper

我想对我的Windows桌面进行一些自定义绘图,以便它可以替换桌面背景(壁纸)。我的第一次尝试是获得desktopListView的DC并吸引它:

IntPtr desktopDC = GetWindowDC(desktopListView);
Graphics g = Graphics.FromHwnd(desktopDC); //<-- fails on out of memory error

然后我尝试创建一个NativeWindow并通过将本机窗口的句柄分配给桌面来捕获WM_PAINT消息并自己绘制,但我无法看到任何消息到桌面。

理想情况下,我想在WPF中执行此操作,而不是在Windows窗体中执行此操作。任何线索如何创建一个我可以绘制的WPF窗口,它位于桌面图标下方,但在壁纸之上,它忽略了任何鼠标消息,桌面继续正常工作?

2 个答案:

答案 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消息来完成此操作。这告诉操作系统:确保我的窗口位于所有其他窗口的下方,并使其看起来好像您的窗口粘在桌面上。