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

C++ 如何在Windows中在桌面上绘制文本?,c++,winapi,drawing,C++,Winapi,Drawing,如何在windows桌面上放置文本?我被告知GetDesktopWindow()是我需要的,但我需要一个例子。我假设您的最终目标是在桌面上显示某种状态信息 您必须执行以下任一操作: 将DLL插入资源管理器的进程中,并对桌面窗口(位于Progman窗口层次结构底部的SysListView32子类)进行子类化,以便直接在其上绘制文本 创建一个不可激活的窗口,使用PaintDesktop绘制其背景,并在其上绘制文本 第一个解决方案是最具侵入性的,而且很难编码,所以我不推荐它 第二种解决方案允许最大

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

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

您必须执行以下任一操作:

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

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

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

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

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


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

为什么不在桌面墙纸图像文件中绘制文本

如果你不需要经常更新信息,如果你有一张壁纸图片,这个解决方案是可行的


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

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

  • 使用GetDesktopWindow检索桌面窗口的句柄
  • 使用SetWindowLong将windows消息处理程序指向您自己的过程
  • 在您的过程中,处理WM_PAINT消息(或任何内容),并绘制您需要的内容
  • 在proc中,调用原始消息处理程序(由SetWindowLong返回)
  • 不是100%确定它会工作,但似乎应该这样做,因为这是窗口子类的正常方式


    -don

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

    为什么要这样做?windows中是否已经内置了一个通知系统,您可以使用它来代替向桌面窗口写入文本?提示:可能有。我想制作一个类似windows边栏的东西。主要是作为一种学习经验,但我认为它也会很有用……我已经想到了这一点,但数据必须经常更新。这会导致两次崩溃:一次是当Explorer.EXE无法调用您自己的过程时(它在您的过程中,而不是Explorer)。如果我们可以忽略这一点,当您尝试在Explorer的进程中调用原始WndProc时,它将崩溃,而不是您的进程。