我如何在 c 中获得屏幕分辨率(操作系统 QNX 或 Linux)

Posted

技术标签:

【中文标题】我如何在 c 中获得屏幕分辨率(操作系统 QNX 或 Linux)【英文标题】:How can i get screen resolution in c (Operating system QNX or Linux) 【发布时间】:2013-05-09 05:31:20 【问题描述】:

我正在使用 QNX(屏幕分辨率相互依赖设计)进行 GUI 开发 如何在 c 中获得屏幕分辨率。 我正在使用 QNX 操作系统。 是否可以? 此解决方案是否有任何操作系统功能?

谢谢

【问题讨论】:

你用的是什么图形库? 不确定,但可能对您的情况有所帮助***.com/questions/11387724/… 【参考方案1】:

假设您使用的是带有帧缓冲区的设备(并且具有 root 访问权限): (取自这个答案:Paint Pixels to Screen via Linux FrameBuffer)

另外,如上所述,您使用的图形库会产生很大的不同,因为此代码只会告诉您帧缓冲区设置为什么,而不是 GUI 代码正在使用什么。所以可能根本没用。如果您不使用 X 或任何其他图形库,那么您可能需要使用帧缓冲区,您可以查看其余答案以了解如何执行此操作。 (我强烈建议您使用 DirectFB,这将节省您实现大量代码)。

此外,您还可以使用大多数设备(包括嵌入式设备)上出现的 gl 驱动程序,因此这也会影响您执行所需操作的方式。

您使用的是 SOC 吗?制造商是否有自己的驱动层?这可能会完全不同,并且可能会附带它自己的 API 来处理这个问题。

但无论如何,我希望这会有所帮助。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

int main()

    int fbfd = 0;
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    long int screensize = 0;
    char *fbp = 0;
    int x = 0, y = 0;
    long int location = 0;

    // Open the file for reading and writing
    fbfd = open("/dev/fb0", O_RDWR);
    if (fbfd == -1) 
        perror("Error: cannot open framebuffer device");
        exit(1);
    
    printf("The framebuffer device was opened successfully.\n");

    // Get fixed screen information
    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) 
        perror("Error reading fixed information");
        exit(2);
    

    // Get variable screen information
    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) 
        perror("Error reading variable information");
        exit(3);
    

    printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

    // Figure out the size of the screen in bytes
    //
    close(fbfd);
   

【讨论】:

【参考方案2】:

对于类 unix 的操作系统,您可以使用库 X11,但如果您需要跨平台解决方案,请尝试 GTK+。

完整代码

// The C standart library
#include <stdlib.h>

// GTK+
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gprintf.h>

// X11
#include <X11/Xlib.h>


/*
    Printing a current screen resoltion by using the GTK+3
    https://en.wikipedia.org/wiki/GTK%2B
 */
int
print_screen_resolution_by_GTK(int argc, char *argv[])

    GdkScreen *screen;
    gint width, height;

    gtk_init(&argc, &argv);

    if ((screen = gdk_screen_get_default()) != NULL) 
        width = gdk_screen_get_width(screen);
        height = gdk_screen_get_height(screen);
        g_printf("Current screen resolution: %dx%d (by used GTK+)\n", width, height);
    
    return 0;



/*
    Printing a current screen resoltion by using the libX11 (worked only for Unix-like OS)
    https://en.wikipedia.org/wiki/X_Window_System

    Based on:
        https://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html
        http://surfingtroves.blogspot.com/2011/01/how-to-get-screen-resolution-in-linux-c.html
 */
int
print_display_resolution_by_X11()

    Display *display;
    Window window;
    XWindowAttributes xw_attrs;

    if ((display = XOpenDisplay(NULL)) == NULL) 
        fprintf(stderr, "Failed to open default display\n");
        return -1;
    

    window = DefaultRootWindow(display);

    XGetWindowAttributes(display, window, &xw_attrs);

    printf("Current window resolution: %dx%d (by used X11)\n", xw_attrs.width, xw_attrs.height);

    XCloseDisplay(display);

    return 0;



int main(int argc, char *argv[])

    print_screen_resolution_by_GTK(argc, argv);
    print_display_resolution_by_X11();
    return EXIT_SUCCESS;

汇编

gcc -o main main.c `pkg-config --libs --cflags gtk+-3.0 x11`

结果(我的电脑实际)

Current screen resolution: 1366x768 (by used GTK+)
Current window resolution: 1366x768 (by used X11)

【讨论】:

【参考方案3】:

你可以简单地使用我创建的这个函数,它从你的配置文件中获取屏幕大小,分割它,然后返回 2 个值(分辨率为 x 和 y)

我在 Ubuntu 20.04 上试过,效果很好!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned short *get_screen_size(void)

    static unsigned short size[2];
    char *array[8];
    char screen_size[64];
    char* token = NULL;

    FILE *cmd = popen("xdpyinfo | awk '/dimensions/ print $2'", "r");

    if (!cmd)
        return 0;

    while (fgets(screen_size, sizeof(screen_size), cmd) != NULL);
    pclose(cmd);

    token = strtok(screen_size, "x\n");

    if (!token)
        return 0;

    for (unsigned short i = 0; token != NULL; ++i) 
        array[i] = token;
        token = strtok(NULL, "x\n");
    
    size[0] = atoi(array[0]);
    size[1] = atoi(array[1]);
    size[2] = -1;

    return size;



int main(void)

    unsigned short *size = get_screen_size();

    printf("Screen resolution = %dx%d\n", size[0], size[1]);

    return 0;

如果您有任何问题,请不要犹豫! :)

【讨论】:

以上是关于我如何在 c 中获得屏幕分辨率(操作系统 QNX 或 Linux)的主要内容,如果未能解决你的问题,请参考以下文章

如何在QNX中检测来自ncurses的屏幕调整大小事件?

如何获得你的安卓设备的屏幕分辨率..? [复制]

英伟达显卡笔记本如何免费获得2k甚至4k屏幕

如何更改屏幕方向并获得更改的画布大小

我们可以获得winlogon屏幕的坐标(x,y),以便在系统中设置任何分辨率吗? (如附图所示)

如何在 python/kivy/pyjnius 检测 Android 中的屏幕分辨率?