如何直接写到屏幕上?

Posted

技术标签:

【中文标题】如何直接写到屏幕上?【英文标题】:How do I write directly to the screen? 【发布时间】:2016-03-09 10:19:40 【问题描述】:

具体来说,我想在显示器上显示文本和图像,在所有其他窗口的顶部,但不能点击或以任何可能的方式与之交互 - 点击它应该直接进入下面的任何窗口。

到目前为止,我的研究使我尝试阅读有关复合覆盖窗口的 X 文档,但不幸的是,我无法使用它。我发现唯一有帮助的资源是一个小型 nodejs 库(node-x11),不幸的是,它似乎已被遗弃,但仍然不完整,我无法开始工作。貌似还有一个python库,不过好像比nodejs上的还不够完善。

【问题讨论】:

【参考方案1】:

node-x11作者在这里(并没有放弃,我只是添加我需要或用户要求的功能,所以如果您遗漏了什么,请填写问题!)

您可以从composite extension 使用GetOverlayWindow

0.3 版协议增加了复合覆盖窗口,它 为合成管理器提供一个无需在其上进行绘制的表面 干涉。这个窗口总是在普通窗口之上并且总是 屏幕保护程序窗口下方。它是一个 InputOutput 窗口,其宽度 和高度是屏幕尺寸。它的视觉是根视觉 并且它的边框宽度为零。尝试使用 复合扩展被忽略。此窗口不会出现在 QueryTree 请求的回复。它也是一个覆盖重定向窗口。 最后两个特性使它对窗口管理器和其他 X11 不可见 客户。访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。最初,复合覆盖 窗口未映射。

CompositeGetOverlayWindow 返回 Composite Overlay 的 XID 窗户。如果窗口还没有被映射,它被这个映射 要求。当所有调用此请求的客户端都已终止 他们的 X11 连接窗口未映射。

复合管理器可以直接渲染到复合叠加层 窗口,或者它们可能将其他窗口重新设置为该窗口的子级 窗口并渲染到这些。多个客户端可能会呈现给 Composite Overlay Window,创建它的子窗口,重塑它,并 重新定义其输入区域,但遵循特定的仲裁规则 本规范未定义这些客户端;这些政策 应该由客户自己定义。

node-x11 示例:

var x11 = require('x11');
x11.createClient(function(err, display) 
  var X = display.client;
  var root = display.screen[0].root;
  X.require('composite', function(err, Composite) 
    Composite.GetOverlayWindow(root, function(err, overlayId) 
      // now you can draw on overlayId window here.
    );
  );
);

【讨论】:

是的,我看到了。我能够让它创建一个新窗口(使用 X.CreateWindow)然后在其上绘制,但我无法让它在覆盖窗口上绘制,经过几天的工作,我沮丧地放弃了- 我认为我对 nodejs 的理解还不够好,无法弄清楚它是如何工作的,而且它处于那个尴尬的高度,它离 C 太远了,X 文档无法提供帮助,但仍然太低而无法猜测。跨度> 我通过制作一个普通窗口然后将其作为父级覆盖来部分工作,但最后我转向了 PyQt5

以上是关于如何直接写到屏幕上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有窗口的情况下将图像直接传送到屏幕上?

函数fun的功能是将形参给定的字符串整数浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在屏幕上

C# 捕获直接 3D 屏幕

请问ABAP中,如何从标准屏幕上获取到选择屏幕中一个字段的输入值。可以举个例子吗?这里感谢大家了。

如何检查应用程序当前正在运行的屏幕?

ABAP 如何获取屏幕输入的字段,不是选择屏幕,是screen painter中用数据库直接生成的可以输入的字段?