Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Linux中以编程方式获得窗口和系统的分辨率?_C++_Linux_Screen Resolution - Fatal编程技术网

C++ 如何在Linux中以编程方式获得窗口和系统的分辨率?

C++ 如何在Linux中以编程方式获得窗口和系统的分辨率?,c++,linux,screen-resolution,C++,Linux,Screen Resolution,我试图在Linux系统上获得屏幕的分辨率以及特定窗口(程序正在其中运行)的分辨率。我不需要修改分辨率,我只需要当前值。据我所知,我们可以在Windows上调用一些系统函数,在Linux上如何做到这一点,最好使用C/C++语言?提前谢谢 更新:事实上,我不需要做GUI,尽管我知道Qt和GTK+可以做,但我不愿意仅仅为了获得分辨率而包含外部库。在X11中,您需要调用Xlib来获取各种窗口信息,包括相对于父窗口的大小和位置。有关如何使用它的示例,您可以在谷歌上搜索“xwininfo.c” 也就是说,您

我试图在Linux系统上获得屏幕的分辨率以及特定窗口(程序正在其中运行)的分辨率。我不需要修改分辨率,我只需要当前值。据我所知,我们可以在Windows上调用一些系统函数,在Linux上如何做到这一点,最好使用C/C++语言?提前谢谢


更新:事实上,我不需要做GUI,尽管我知道Qt和GTK+可以做,但我不愿意仅仅为了获得分辨率而包含外部库。

在X11中,您需要调用Xlib来获取各种窗口信息,包括相对于父窗口的大小和位置。有关如何使用它的示例,您可以在谷歌上搜索“xwininfo.c”


也就是说,您可能会使用一些更高级的框架来进行窗口编程—很可能它已经有了一些其他的原语,请参见示例—因此您可能需要提供更多关于这个问题的背景信息。

命令行工具xdpyinfo为您提供了这些信息;正如Andrew Y所解释的那样,要以编程方式实现这一点,您需要使用Xlib。

取决于:

  • 如果您是铁杆玩家,并且希望使用Xlib,请查看XDisplayWidth()和XDisplayHeight()
  • 如果使用Qt4(我的首选项),请尝试QApplication::desktop()->screenGeometry()(请参阅)
  • 或者在Gtk中,请参见

要获得屏幕分辨率,您可以使用XRandR扩展,如来源:


Qt或Gtk+可以获得特定窗口的分辨率吗?我可以获得带有Gtk的窗口列表,但没有名称、id或任何东西。不知道如何识别特定的窗口。最终选择了Xlib,解决了我的问题(尽管代码看起来有点恶心…),如果没有GUI,那么它是一个控制台应用程序吗?即使不在X下运行,您也需要这些值吗?有GUI,但我正在处理的部分不需要。RandR比DisplayWidth/DisplayHeight更详细,但两者都很有用(原因不同)。据我所知,
DisplayWidt
/
DisplayHeight
只能列出当前的屏幕大小。它们并不是要列出所有可用的屏幕大小(显示模式)。这就是
Xrandr
XF86vm
的用途。简短的问题:从
xrconfigsize
返回的
size
数组(作为地址)是否需要稍后释放?还是由图书馆内部分配和管理?我在文档中找不到任何与此相关的内容(如果有,除了略显的手册页之外)。我发现DisplayWidth/DisplayHeight和XDisplayWidth和XDisplayHeight不准确,而xrandr似乎准确。 QApplication::desktop()->screenGeometry()
  SizeID        current_size;
  XRRScreenSize *sizes;
  dpy = XOpenDisplay (display_name);
  // ...
  root = RootWindow (dpy, screen);
  sc = XRRGetScreenInfo (dpy, root);
  current_size = XRRConfigCurrentConfiguration (sc, &current_rotation);
  sizes = XRRConfigSizes(sc, &nsize);
  for (i = 0; i < nsize; i++) {
    printf ("%c%-2d %5d x %-5d  (%4dmm x%4dmm )",
         i == current_size ? '*' : ' ',
         i, sizes[i].width, sizes[i].height,
         sizes[i].mwidth, sizes[i].mheight);
     // ...
  }
Display *dpy;
// dpy = ...
int scr = /* ... */
printf ("  dimensions:    %dx%d pixels (%dx%d millimeters)\n",
        DisplayWidth (dpy, scr), DisplayHeight (dpy, scr),
        DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr));