这似乎是一个简单的问题,但我找不到答案:如何通过 X11 查询存在哪些显示器以及它们的分辨率?
这可能对命令行和脚本很有帮助。
xwininfo -root
但在多显示器环境下,xRandR可能更准确:
xrandr
XineramaQueryScreens
。否则,您可以假设只有一个屏幕,并使用(X)WidthOfScreen
/(X)HeightOfScreen
。:x.0
,:x.1
等。)对于现代的X服务器,还有XRandR扩展,它提供了最新的多屏幕布局信息模型,包括重叠屏幕和动态屏幕更改。
相关文档可在XRandR 1.3.1协议规范和libXrandr手册页中找到。
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
基于:
屏幕1:3520X1200
我正在使用两个“加入显示器”,如显示GUI设置所示。第一个是1920x1200。第二个是较小的笔记本电脑显示器。代码结果给出了两个显示器并排覆盖的总区域。我想以编程方式确定主显示器的分辨率。 - PulseczarPython
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))
Bash
$ xrandr --listmonitors
$ xrandr
$ xrandr | grep '*' | awk {'print $1'}
xrandr
输出供 ImageMagick 使用$ xrandr |grep \* |awk '{print $1}'
以下是结果:
1920x1080
程序xdpyinfo几乎可以告诉你有关X11服务器的所有信息。
$ xdpyinfo | sed -n '/^screen #0/{n;p}'
dimensions: 3840x2160 pixels (696x391 millimeters)
对于ffmpeg
:
$ xdpyinfo | sed -n '/^screen #0/{n;s/^[ a-z:]*//;s/ .*//p}'
3840x2160
xwininfo -root
相比,xrandr
并不告诉你当前活动的显示器。但是,它通过活动根窗口的代理告诉你有关显示器的信息。 - CMCDragonkaixprop -root
是xwininfo
的另一种选择,但每个-root
选项都需要一个 root 窗口。在.xinitrc
中,您不能依赖于根窗口的存在。 - ceving