gpt4 book ai didi

wpf - 更换桌面墙纸/在桌面上绘制

转载 作者:可可西里 更新时间:2023-11-01 09:27:03 25 4
gpt4 key购买 nike

我想在我的 Windows 桌面上做一些自定义绘图,这样它就可以替换桌面背景(墙纸)。我的第一个尝试是为 desktopListView 获取一个 DC 并绘制它:

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

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

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

最佳答案

如果您获得桌面的窗口句柄,您可以创建一个新窗口并将您自己的自定义窗口添加为该窗口的子窗口。将它放在 ListView 后面可能会给您带来所需的结果,但我不能 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);


}

}

关于wpf - 更换桌面墙纸/在桌面上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com