【问题标题】:How to draw text on the desktop in Windows?如何在 Windows 的桌面上绘制文字?
【发布时间】:2010-11-26 17:04:52
【问题描述】:

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

【问题讨论】:

  • 你为什么要这样做?是否还没有内置在窗口中的通知系统,您可以使用它而不仅仅是将文本写入桌面窗口?提示:可能有。
  • 我想做一个类似windows-sidebar的东西。主要是作为一种学习经验,但我认为它也会很有用......

标签: c++ winapi drawing


【解决方案1】:

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

您将不得不这样做:

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

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

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

第二种解决方案具有最大的灵活性。没有“未记录”或依赖 Explorer 的特定实现,甚至没有将 Explorer 作为外壳。

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

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

【讨论】:

    【解决方案2】:

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

    如果您不必过于频繁地更新信息并且您有墙纸图片,则此解决方案将是可行的。

    可以很方便地使用CImage类加载壁纸图片,CImage::GetDC()获取设备上下文进行绘制,然后保存新图片,最后将桌面壁纸更新为新图片。

    【讨论】:

    • 我已经想到了,但是数据要经常更新。
    【解决方案3】:

    我没有尝试过,但我认为您可以执行以下操作:

    1. 使用 GetDesktopWindow 获取桌面窗口句柄
    2. 使用 SetWindowLong 将 windows 消息处理程序指向您自己的过程
    3. 在您的 proc 中,处理 WM_PAINT 消息(或其他)并绘制您需要的内容。
    4. 在您的 proc 中,调用原始消息处理程序(由 SetWindowLong 返回)。

    不是 100% 确定它会起作用,但它似乎应该起作用,因为这是对窗口进行子类化的正常方式。

    -不要

    【讨论】:

    • 这会崩溃两次:当 Explorer.EXE 无法调用您自己的过程时(它在您的进程中,而不是 Explorer)。如果我们可以忽略这一点,当您尝试在 Explorer 的进程中调用原始 WndProc 时,它会崩溃,而不是您的。
    【解决方案4】:

    如果您的意图是制作侧边栏之类的东西,您可能只想创建一个或多个layered windows。这也将允许您处理鼠标单击和其他正常输入源,并且如果您提供 alpha 通道信息,Windows 将确保您的窗口始终正确绘制。如果您不希望窗口具有交互性,请使用 Koro 建议的适当样式(例如 WS_EX_NOACTIVATE)。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2010-12-04
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2018-08-12
      • 1970-01-01
      • 2011-10-22
      相关资源
      最近更新 更多