如何使用 Python 获取任务栏的大小和位置

克里斯蒂安·西罗利

我正在用 Python 开发一个模块,我想找出一种方法来获得显示器分辨率减去任务栏,而无需任何用户交互,并且最好以不干扰视觉界面的方式。如果我能得到任务栏的大小和位置,我可以很容易地从显示器分辨率中减去它。但是,我似乎无法找到方法。

在 Windows 中,我能够使用该win32api模块并用于GetMonitorInfo获取显示器分辨率。但是,我还没有想出某种方法可以在 Ubuntu 或一般的 Linux 中做到这一点。如果您也有在 macOS 中执行此操作的方法,那也很高兴知道,但对于此问题不是必需的。

我想支持尽可能多的桌面环境,但我意识到这样做有多么困难,因为每个环境都可能有自己的解决方案。考虑到这一点,我更愿意从这些桌面环境开始:

  • 在哪里
  • XFCE
  • 侏儒
  • 肉桂

如果这需要一些外部程序来获取它,我更愿意使用桌面环境或操作系统自带的东西。

谢尔盖·科洛迪亚日内

我想找出一种方法,在没有任何用户交互的情况下获得显示器分辨率减去任务栏,并且最好以不干扰视觉界面的方式。

这就是被问到的问题,我将根据我的发现将重点放在这个答案中。获取任务栏的大小和位置是一个原始想法,但正如评论中所讨论的那样,如果不了解大量信息,这将很难实现 - 哪个面板或停靠栏正在运行,它们是否_NET_WM_STRUT设置了属性,它们是否通过以下方式公开该信息GSettings 数据库或其他方法。我确信这不是不可能的,但相当困难。

NET_WORKAREA 属性

根据根窗口的规范,_NET_WORKAREA 定义如下:

_NET_WORKAREA,x,y,宽度,高度 CARDINAL/32

该属性必须由窗口管理器在计算每个桌面的工作区时设置。包含每个桌面的几何图形。这些几何图形是相对于每个桌面上的视口指定的,并指定一个完全包含在视口内的区域。桌面应用程序应该使用工作区来适当地放置桌面图标。

窗口管理器应该通过获取当前页面减去停靠和面板窗口占用的空间来计算此空间,如客户端窗口上设置的 _NET_WM_STRUT 或 _NET_WM_STRUT_PARTIAL 属性所示。

有几点需要注意:

  • 符合这些规范的窗口管理器必须设置此属性,因此在 XFCE、Budgie、Unity、GNOME、KDE ​​等桌面环境中 - 在任何官方 Ubuntu 风格中,不使用任何实验性窗口管理器都将设置此属性; 换句话说,这将适用于受支持的桌面
  • 这会计算可用的宽度和高度,但也会计算相对于整个显示器最左角的偏移量(在双屏的情况下,最左边的屏幕的左上角将是起点)
  • _NET_WM_STRUT_NET_WM_STRUT_PARTIAL是由码头和面板设置属性。这意味着,如果面板或停靠栏不设置它,它们的行为基本上就像一个普通窗口,只是位于所有其他窗口之上(并可能使用户感到恼火1)。也就是说,这对我们来说已经足够了。我已经在 Ubuntu 18.04 之上的 Cinnamon、LXQt 和 XFCE 上测试了这个属性。在所有情况下,坞站和面板都将其支柱区域正确通知窗口管理器。这意味着,_NET_WORKAREA将在 99% 的情况下为您工作。

可以通过xprop根窗口上的实用程序在 shell 中查询此属性

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3120, 974, 0, 32, 3120, 974

这是我的双显示器设置的输出,两个显示器沿顶部对齐,一个底座和顶部面板。如果您注意到只有前四个值是重要的,而其他四个值是重复的。特别感兴趣的是3120974这就是我们感兴趣的值。前两个告诉我们桌面最左边的角落从哪里开始。我的顶部面板占据 32 点,因此桌面的最左角从左侧开始,向下偏移 32 点。从底部偏移通常对窗口无关紧要 - 它们会填满可用的工作区。

如果我将 Dock 放在主显示器的右侧,您会注意到宽度减少了,但高度有:

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

高度变化为 44 点。再添加 32(顶部面板窗口的大小),您将获得 1050 与我桌面的几何形状完全相同(请注意之前的 3120 没有停靠尺寸,因此使用了完整的桌面宽度):

$ xprop -root _NET_DESKTOP_GEOMETRY
_NET_DESKTOP_GEOMETRY(CARDINAL) = 3120, 1050

蟒蛇和 xprop

xprop上面命令随大多数桌面一起提供,并且属于x11-utils包,因此如果您的目标是基于 Debian 的主要系统,您应该在大多数情况下都可以使用它。我会做的是使用 Python 的subprocess,并利用subprocess.check_output()orsubprocess.run()命令并通过re模块解析输出

>>> import re,subprocess
>>> out = subprocess.check_output(['xprop','-root','_NET_WORKAREA'])
>>> workarea_tokens = re.split('=|,',out.decode())
>>> workarea_tokens[1:5]
[' 0', ' 32', ' 3059', ' 1018']

Python 和 Gdk

另一种方法(通常是我的首选方式)是使用与其他 GNOME 项目库密切相关的 Gdk如果您正在使用 Gtk 开发桌面应用程序,那么您已经拥有了可用的必要工具,那么为什么不使用它们呢?棘手的部分是您必须为每个单独的监视器计算工作区。

#!/usr/bin/env python3
import gi
gi.require_version('Gtk','3.0')
gi.require_version('Gdk','3.0')
from gi.repository import Gdk,Gtk,GdkX11

display = Gdk.Display().get_default()
for i in range(display.get_n_monitors()):
    monitor = display.get_monitor(i)
    w_area  = monitor.get_workarea()
    print(w_area.x, w_area.y,
          w_area.width, w_area.height)

这个程序的结果:

$ python3  display_area.py
1440 32 1619 1018
0 0 1440 900
# width of two monitors with dock on right adds up to _NET_WORKAREA
$ echo $((1619+1440))
3059
$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

问题

现在,还记得我说过我有双显示器吗?这种设置打开了很多可能性,但也揭示了某些奇怪的行为。

# added xfce4-panel at the bottom of second screen, no change in height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 526, 32, 2533, 1018, 526, 32, 2533, 1018
# stopped xfce4-panel process, same height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
# added xfce4-panel to the top of second monitor
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 49 1619 1001
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 49, 3059, 1001, 0, 49, 3059, 1001

请记住,我在一个屏幕上有一个面板和一个底座,并在另一个屏幕上添加了用于测试xfce4-panelGdk 的错误结果是第二个监视器工作区没有改变。xprop还报告了错误的数字——526从左侧偏移的第一个输出点根本不是真的。然而,在最后一个输出中,垂直偏移增加了,这是一件好事 - 增加的额外宽度xfce4-panel应该添加到总数中,可能有帮助的是我的两个显示器在顶部对齐。

换句话说,如果您的应用程序计划确定没有底座和面板的区域,这些方法最适合单显示器设置。在双显示器设置中 - 结果可能会不一致。请注意,我正在使用 Metacity 窗口管理器,并且错误可能归因于此。但是,我目前没有办法用双显示器设置测试其他 WM,所以我将把这一部分留作不确定。

全部(某天)

  • C 或 Python 中的 libx11 示例

  • 使用替代窗口管理器进行双显示器测试

  • 查找坞站和面板位置


脚注

1功能未记录,取决于用户的耐心程度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在我的python框架和任务栏图标之间进行通信

来自分类Dev

如何使任务栏(和/或打开的窗口)保持屏幕外?

来自分类Dev

如何隐藏PyQt4 Python应用程序的任务栏图标?

来自分类Dev

Python-如何与系统任务栏弹出窗口进行交互

来自分类Dev

如何更改平滑任务血浆任务栏的默认图标大小?

来自分类Dev

如何使任务栏图标的大小与Windows 8上的大小相同?

来自分类Dev

如何获得侧边栏任务栏?

来自分类Dev

如何使Excel完全全屏,隐藏窗口的标题栏和Windows任务栏?

来自分类Dev

Windows 8.1中的任务栏如何更改其默认大小

来自分类Dev

Windows 7:如何更改任务栏字体大小

来自分类Dev

如何在任务栏时钟中添加日期而无需调整大小?

来自分类Dev

如何在任务栏中更改最小化的窗口大小?

来自分类Dev

如何在我的任务栏上获取“获取Windows 10应用程序”图标

来自分类Dev

Windows 10使用热键而不是光标位置取消隐藏任务栏

来自分类Dev

如何使用Powershell脚本从任务栏杀死Word文档

来自分类Dev

如何同时将任务栏与Unity配合使用?

来自分类Dev

Python 3和GTK3:跨平台任务栏图标

来自分类Dev

Python 3和GTK3:跨平台任务栏图标

来自分类Dev

如何检测任务栏上的单击?

来自分类Dev

如何管理系统任务栏图标?

来自分类Dev

如何从任务栏删除商店

来自分类Dev

如何重新启动任务栏?

来自分类Dev

如何从任务栏中删除图标?

来自分类Dev

如何完全禁用Windows任务栏?

来自分类Dev

如何让任务栏分布在多行上?

来自分类Dev

使用AutoHotKey启动任务栏应用

来自分类Dev

如何获取显示隐藏的系统任务栏图标的窗口的隐藏窗口句柄

来自分类Dev

如何在任务栏中获取 HDD 运行状态 LED 监视器

来自分类Dev

如何使用Python 2.7获取进程位置?

Related 相关文章

  1. 1

    如何在我的python框架和任务栏图标之间进行通信

  2. 2

    如何使任务栏(和/或打开的窗口)保持屏幕外?

  3. 3

    如何隐藏PyQt4 Python应用程序的任务栏图标?

  4. 4

    Python-如何与系统任务栏弹出窗口进行交互

  5. 5

    如何更改平滑任务血浆任务栏的默认图标大小?

  6. 6

    如何使任务栏图标的大小与Windows 8上的大小相同?

  7. 7

    如何获得侧边栏任务栏?

  8. 8

    如何使Excel完全全屏,隐藏窗口的标题栏和Windows任务栏?

  9. 9

    Windows 8.1中的任务栏如何更改其默认大小

  10. 10

    Windows 7:如何更改任务栏字体大小

  11. 11

    如何在任务栏时钟中添加日期而无需调整大小?

  12. 12

    如何在任务栏中更改最小化的窗口大小?

  13. 13

    如何在我的任务栏上获取“获取Windows 10应用程序”图标

  14. 14

    Windows 10使用热键而不是光标位置取消隐藏任务栏

  15. 15

    如何使用Powershell脚本从任务栏杀死Word文档

  16. 16

    如何同时将任务栏与Unity配合使用?

  17. 17

    Python 3和GTK3:跨平台任务栏图标

  18. 18

    Python 3和GTK3:跨平台任务栏图标

  19. 19

    如何检测任务栏上的单击?

  20. 20

    如何管理系统任务栏图标?

  21. 21

    如何从任务栏删除商店

  22. 22

    如何重新启动任务栏?

  23. 23

    如何从任务栏中删除图标?

  24. 24

    如何完全禁用Windows任务栏?

  25. 25

    如何让任务栏分布在多行上?

  26. 26

    使用AutoHotKey启动任务栏应用

  27. 27

    如何获取显示隐藏的系统任务栏图标的窗口的隐藏窗口句柄

  28. 28

    如何在任务栏中获取 HDD 运行状态 LED 监视器

  29. 29

    如何使用Python 2.7获取进程位置?

热门标签

归档