【问题标题】:How to draw lines with WinApi on desktop C++如何在桌面 C++ 上使用 WinApi 画线
【发布时间】:2020-10-23 10:17:09
【问题描述】:

我想在不使用窗口的情况下在桌面上画线。我试过这段代码:

const HDC dc = GetDC(NULL);

while (true) {
    MoveToEx(dc, 100, 100, NULL);
    LineTo(dc, 50, 50);
}

但它不起作用。我怎样才能意识到这一点?

【问题讨论】:

  • 不使用窗口” - 为什么?
  • 另外,您的代码也有效。您可能使用不清晰可见的颜色(黑色,我猜是在黑色控制台窗口中)或线条太短而无法注意到。 LineTo(dc, 1920, 1080);(或任何你的屏幕分辨率)可能会让它引人注目。
  • 不确定您的期望和/或您最终的目标。它确实显示了一条黑线,但是由于您不拥有桌面,因此几乎可以用任何东西擦除该黑线。如果您使用主机背刷(透明“丙烯酸”笔刷)移动复合窗口(例如,Windows 10 Calc、UWP 应用程序)使其重叠,它实际上会在视觉上严重混淆该应用程序窗口(因为您正在这样做在无限循环中,这非常糟糕)。搞砸 Windows 很有趣,但你不能用它来进行严肃的编程。

标签: c++ windows winapi graphics gdi


【解决方案1】:

但它不起作用。

当然不是。窗口内容属于提供与该窗口关联的窗口过程的任何人。你不能只是劫持别人的窗户表面并希望一切都会好起来。

我怎样才能意识到这一点?

你不能,鉴于你的限制“不使用窗口”。要么您使用自己的窗口。或者对您的目标应用程序进行逆向工程,并以某种方式将您的代码注入其中。

【讨论】:

  • @ted 它只有效,如果 “它确实有效” 对你来说意味着 “我偶尔可以看到我想要的输出,如果只是一段时间,我的计算机不会立即着火”。确实有太多的开发人员在“这段代码是正确的”“这段代码还没有失败” 之间没有区别。让我们不要尝试添加它。
  • 忙于写入系统从未评估过的设备上下文,因为它正在渲染全屏、独占的 DirectX 或 OpenGL 窗口并不会神奇地使忽略的设备上下文产生任何效果.现在,虽然有可能在某种程度上遵循两种渲染技术竞争屏幕的结果,但我们甚至不知道有多少竞争渲染技术构成了一个看起来像单个桌面的东西。
  • @ted 奇数。我确定我刚刚发布了一条评论,其中概述了一个场景,其中代码要么没有画线(很可能),要么这条线永远不会进入显示的帧缓冲区。
  • @ted 当您声称 “它在 W95 中有效并且在 W10 中仍然有效”时,您是否真正验证过?我的意思是,它不像 Windows 10 在 Windows 95 附近的任何地方呈现桌面。 Windows Vista 引入了 DWM,Windows 7 再次将其移至硬件,Windows 8 引入了组合引擎,我什至不知道 Windows 8.1 和 Windows 10 版本 x、y 或 z 发生了什么变化。我可以自信地说,发布的代码不仅仅适用于我概述的一种情况。我可以自信地说,这是不明智的。
  • 所以你没有验证,如果/如何改变,如果有一个带有 Aero Glass 效果的窗口在行下?还是 WPF 窗口?或者,比如说,那些不那么新奇的 Windows 10 XAML 应用程序之一?还是那些全新的 WinUI 3 窗口之一?还是 Direct2D 窗口?有或没有丙烯酸刷?还是其他 Project Reunion 的竞争者之一?
猜你喜欢
  • 2023-04-06
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多