如何直接写到屏幕上?
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的功能是将形参给定的字符串整数浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在屏幕上