如何在桌面上绘制文本?

3
我需要直接在桌面上绘制滚动文本。我可以使用DC:= GetDC(0)在所有窗口的顶部绘制文本。但我不想这样做。绘图必须仅在桌面上进行,而不是在所有打开的窗口之上。我的文字需要在桌面图标下面!
我该如何在Delphi中实现这一点?我猜Windows 7具有新的API函数,可以更容易地访问桌面窗口,因为它可以淡化壁纸。

如果您不希望文本停留在桌面图标下方,则具有淡出壁纸的窗口是无关紧要的。 - Sertac Akyuz
嗨Sertac。你能详细说明一下吗? - Gabriel
具有壁纸的窗口位于具有图标(SysListView32)的窗口下方,这就是我所说的全部内容。如果您在除了为桌面获取的DC(progman、workerw、shelldll_defview等)之外的任何东西上编写滚动文本,则该文本将保留在桌面图标下方。如David所说,在其自己的窗口中提供文本会更容易。 - Sertac Akyuz
"有壁纸的窗口" - 是的,是的,这就是我需要的。我该如何获取该窗口的句柄? - Gabriel
1
我认为应该是 WorkerW(不确定),但它只在壁纸旋转时出现。搜索 'workerw',你会找到很多使用 FindWindow[Ex] 获取句柄的代码示例... 使用 Spy++ 或类似工具查找桌面窗口层次结构,当壁纸旋转时和不旋转时显示/隐藏它们以找出哪一个具有桌面背景。不知道,就像这样... - Sertac Akyuz
这在Windows 98时代使用“活动桌面”是可能的。(您可以将对象放置在桌面上)。 - Warren P
2个回答

8
长期以来,使用分层窗口就已经可以实现此功能。使用WS_EX_LAYEREDWS_EX_TRANSPARENT窗口状态。确保窗口的z顺序将其置于所有其他顶级窗口之下。我链接的文章有很多代码示例供您参考。
在我添加了这个答案后,您又提出了一个要求,即在桌面图标下方绘制文本。我怀疑使用分层窗口是不可能的,因为分层窗口不能是子窗口。

嗨。我还没有完全阅读文档,但它说“提供了一种有效的方法来为顶层窗口添加透明度和半透明度”。我想在桌面上绘制,这样我的文本即使在我的应用程序未运行时也会保留在那里。例如,微软的壁纸幻灯片工具可以在两个图像之间提供平滑的过渡。即使该工具未运行,图像仍然保留在那里。 - Gabriel
1
你可以使用分层窗口来实现你想要的效果。关键是 WS_EX_TRANSPARENT,它使窗口变得透明,从而可以穿透点击。 - David Heffernan
但是使用这种方法绘制的文本将会在图标上方而不是下方。 - Gabriel

2
如果您希望在应用程序未运行时仍然能够看到文本,则唯一的选择是更改壁纸:找出桌面壁纸的图像,将文本添加到该图像中,并将其另存为新壁纸并使用它。

我同意这一点。但是是否有可能在不向系统中的所有窗口发送REFRESH消息的情况下更改壁纸。似乎微软的壁纸幻灯片正是这样做的。 - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接