3

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

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

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

理想情况下,我想在 WPF 而不是 Windows 窗体中执行此操作。有什么线索可以创建一个我可以绘制到的 WPF 窗口,该窗口位于桌面图标下方但位于墙纸顶部,以便它忽略任何鼠标消息并且桌面继续正常工作?

4

2 回答 2

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


        }

    }
于 2009-05-07T15:09:55.570 回答
1

我通过让我的窗口WM_WINDOWPOSCHANGING通过设置来响应消息来做到这一点WINDOWPOS.hWndInsertAfter = HWND_BOTTOM。这对操作系统说:确保我的窗口位于所有其他窗口的下方,并使其看起来好像您的窗口粘在桌面上。

于 2009-05-07T17:06:07.973 回答