如何在Windows桌面上绘制文本?

时间:2009-09-09 03:21:54

标签: c++ winapi drawing

我如何在Windows桌面上放置文字?我被告知GetDesktopWindow()是我需要的,但我需要一个例子。

4 个答案:

答案 0 :(得分:9)

我假设您的最终目标是在桌面上显示某种状态信息。

你必须这样做:

  • 将DLL注入资源管理器的进程并子类化桌面窗口(SysListView32窗口层次结构底部的Progman),直接在其上绘制文本。

    < / LI>
  • 创建一个不可激活的窗口,其背景使用PaintDesktop绘制,并在其上绘制文字。

第一种解决方案是最具侵入性的,而且很难编码,所以我不推荐它。

第二种解决方案允许最大的灵活性。没有“无证件”或依赖于Explorer的特定实现,甚至只是将Explorer作为shell。

为了防止窗口在单击时被置于顶部,您可以在Windows 2000及更高版本上使用扩展窗口样式WS_EX_NOACTIVATE。在下层系统中,您可以处理WM_MOUSEACTIVATE消息并返回MA_NOACTIVATE

如果您通过使用分层窗口需要真正的透明度,则可以使用PaintDesktop调用,但概念保持不变。我写了另一个回答,详细说明了如何使用GDI +正确地使用alpha进行分层窗口。

答案 1 :(得分:1)

为什么不在桌面壁纸图像文件中绘制文字?

如果您不必经常更新信息并且有壁纸图像,则此解决方案是可行的。

可以轻松使用CImage类加载壁纸图像,CImage::GetDC()以获取要绘制的设备上下文,然后保存新图像,最后将桌面壁纸更新为新图像。

答案 2 :(得分:0)

我没试过,但我认为你可以做到以下几点:

  1. 使用GetDesktopWindow检索桌面窗口的句柄
  2. 使用SetWindowLong将Windows消息处理程序指向您自己的过程
  3. 在你的过程中,处理WM_PAINT消息(或其他)并绘制你需要的东西。
  4. 在您的proc中
  5. ,调用原始消息处理程序(由SetWindowLong返回)。
  6. 不是100%确定它会起作用,但似乎应该这样,因为这是子窗口的常规方法。

    -don

答案 3 :(得分:0)

如果您的目的是生成补充工具栏,您可能只想创建一个或多个layered windows。这也将允许您处理鼠标点击和其他常规输入源,如果您提供Alpha通道信息,Windows将确保您的窗口始终正确绘制。如果您不希望窗口是交互式的,请使用适合的样式(例如WS_EX_NOACTIVATE),如Koro建议的那样。