【问题标题】:Failed to draw on DesktopWindow在 DesktopWindow 上绘图失败
【发布时间】:2016-09-19 23:40:28
【问题描述】:

我尝试使用GetDC(GetDesktopWindow) 在桌面窗口上绘制任何东西,例如以下简单程序:

#include <windows.h>

int main()
{
    TextOut(GetDC(GetDesktopWindow()), 10, 10, TEXT("Test TextOut Tester!!"), 21);
    return 0;
}

似乎我当前的用户权限会影响绘图行为,我不是我电脑上的管理员,这是原因吗?有没有关于这个问题的文档? 提前致谢

【问题讨论】:

  • 问题是,桌面窗口不属于你。没有合同文件表明这是受支持的方案。 GDI 不受特权的约束。您正在做的事情因另一个原因而失败。完全没有错误处理不会有助于找出答案。
  • 我该怎么办?如果我尝试TextOut 到创建的窗口,它会成功,但是在桌面窗口上执行它会失败,那么问题是什么?即使GetDC 和GetDesktopWindow 的返回值不为零。
  • 这样做很难做到,在重绘和 99.9% 的时间之间是不持久的,这是一个糟糕的想法,有更好的选择(你应该说明你的最终目标)。 GetDesktopWindow() 窗口不是您看到的包含图标、壁纸等的窗口,而是您需要从 GetShellWindow() 开始定位的 syslistview。
  • 我曾经在我的 PC 上的桌面窗口上绘制东西,但在办公室(我不是管理员)出现了提到的问题,我肯定会在我的 PC 上使用所有 GDI 东西,如SetPixel 和TextOut,但在我目前的情况下它不起作用。
  • 您不能在桌面上绘图。它不是你的。别再试图在别人的窗户上画画了!创建一个窗口。以此为基础。

标签: windows winapi drawing gdi win32gui


【解决方案1】:

您不能像这样在桌面窗口上绘图的简单原因是您实际上看不到桌面窗口。自 Windows 95 以来,桌面窗口已完全被资源管理器拥有的一组窗口所掩盖。

当您调用GetDC(GetDesktopWindow()) 时获得的 DC 将因此被完全截断。

如果您想直接在显示器上绘图,GetDC(NULL) 会给您一个 DC,您可以使用它在整个桌面和可见窗口上进行绘图。但是,正如已经提到的,这将完全在 Windows 的重新绘制逻辑之外运行,结果将是丑陋的,不适合任何实际目的(例如,从你的无窗口应用程序中获取某种调试反馈除外)正在开发中)。

大多数想要“在桌面上显示某些东西”的应用程序都是通过创建一个窗口并在其上绘图来实现的。为什么这里不合适?

【讨论】:

  • 谢谢GetDC(NULL)已经成功,我已经直接在屏幕上画了。
【解决方案2】:

这是你应该做的:

HDC hdc = ::GetDC(NULL);

//draw on the desktop using the hdc

::ReleaseDC(NULL, hdc);

【讨论】:

  • 不,不要那样做。它只会在下一个绘画周期中被删除。无论如何,这不是你的窗口。
  • 我很惊讶你给了我一个负面的排名!有时非常希望像这样进行绘制,特别是当您在桌面上使用 ::SetROP2 和 R2_XORPEN 光栅操作进行绘制时。事实是它就是这样做的,没有人问为什么要这样做!这是一种耻辱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多