【发布时间】:2020-05-09 10:36:35
【问题描述】:
这似乎是一个简单的问题,但我找不到答案:您如何(通过 X11)查询存在哪些监视器及其分辨率?
【问题讨论】:
这似乎是一个简单的问题,但我找不到答案:您如何(通过 X11)查询存在哪些监视器及其分辨率?
【问题讨论】:
从Xlib manual 中查看display macros 和screen macros。
具体来说:
ScreenCount(),ScreenOfDisplay()
WidthOfScreen(),HeightOfScreen()
【讨论】:
这可能对 cli 和脚本有帮助
xwininfo -root
但 xRandR 可能更准确,尤其是当有多个监视器环境时:
xrandr
【讨论】:
xrandr 与xwininfo -root 相比并没有告诉您当前处于活动状态的监视器。但是它通过代理告诉您活动根窗口的监视器。
如果正在使用 Xinerama,请尝试 XineramaQueryScreens。否则,您可能可以假设一个屏幕并使用(X)WidthOfScreen/(X)HeightOfScreen.
(另见另一个答案。很可能有人正在使用旧的 X 屏幕模型,您的屏幕是 :x.0、:x.1 等)
【讨论】:
对于现代 X 服务器,还有 XRandR 扩展,它提供了多屏幕布局信息的最新模型,包括重叠屏幕和动态屏幕变化。
它的文档在XRandR 1.3.1 Protocol spec 和libXrandr man page 中提供。
【讨论】:
X11 库仅适用于类 unix 操作系统,因此它不是跨平台解决方案。
完整代码
#include <stdio.h>
#include <X11/Xlib.h>
int
main(const int argc, const char *argv[])
{
Display *display;
Screen *screen;
// open a display
display = XOpenDisplay(NULL);
// return the number of available screens
int count_screens = ScreenCount(display);
printf("Total count screens: %d\n", count_screens);
for (int i = 0; i < count_screens; ++i) {
screen = ScreenOfDisplay(display, i);
printf("\tScreen %d: %dX%d\n", i + 1, screen->width, screen->height);
}
// close the display
XCloseDisplay(display);
return 0;
}
汇编
gcc -o setup setup.c -std=c11 `pkg-config --cflags --libs x11`
结果(我的电脑实际)
Total count screens: 1
Screen 1: 1366X768
基于:
【讨论】:
Total count screens: 1 Screen 1: 3520X1200 我正在使用两个“加入显示”,如显示 GUI 设置所示。第一个是 1920x1200。第二个是更小的笔记本电脑显示器。代码结果为您提供了两个显示器并排覆盖的总面积。我想以编程方式确定主显示器的分辨率。
Python
import os
from Xlib import X, display
d = display.Display()
s = d.screen().root
output = os.popen("xrandr --listmonitors | grep '*' | awk {'print $4'}").read().splitlines()
num_sc = s.xinerama_get_screen_count().screen_count
width = s.get_geometry().width
height = s.get_geometry().height
print("Total count screens: %s" % num_sc)
for i in range(num_sc):
print("\tScreen %s(%s): %sX%s" % (i, output[i], width, height))
重击
$ xrandr --listmonitors
$ xrandr
$ xrandr | grep '*' | awk {'print $1'}
【讨论】:
xrandr 输出以供 imagemagick 使用$ xrandr |grep \* |awk '{print $1}'
结果在:
1920x1080
【讨论】: