Как стать автором
Обновить

Комментарии 23

А причем тут OpenGL? Обычное WinAPI.
Да это так, вступление было.
А если не Windows?
Если Xlib, то я делал так:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xinerama.h>

int main()
{
    Display* display = XOpenDisplay(NULL);
    if (!display) {
        fprintf(stderr, "XOpenDisplay() fails\n");
        return 1;
    }
    int xineramaScreenCount;
    if (XineramaIsActive(display)) {
        XineramaScreenInfo* xineramaScreenInfo =
                     XineramaQueryScreens(display, &xineramaScreenCount);
        printf("Screen count: %d\n", xineramaScreenCount);
        for (int i = 0; i < xineramaScreenCount; i++) {
            printf("Screen #%d: (%d, %d) x (%d, %d)\n",
                   i, xineramaScreenInfo[i].x_org, xineramaScreenInfo[i].y_org,
                   xineramaScreenInfo[i].width, xineramaScreenInfo[i].height);
        }
        XFree(xineramaScreenInfo);
    } else {
        xineramaScreenCount = XScreenCount(display);
        printf("Screen count: %d\n", xineramaScreenCount);
        for (int i = 0; i < xineramaScreenCount; i++) {
            Screen* screen = ScreenOfDisplay(display, i);
            printf("Screen #%d: (0, 0) x (%d, %d)\n",
                    i, screen->width, screen->height);
        }
    }
    return 0;
}

Компилить:
gcc -o x x.c -std=c99 -lX11 -lXinerama
if ((dc.StateFlags & DISPLAY_DEVICE_ACTIVE) && !(dc.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))


будет более корректно.
Дополнил, спасибо.
Хм, в своё время написал подобную реализацию за 10 минут включая прочтение MSDN.
Что здесь сложного?

Вот если бы хотя бы кроссплатформенно — то да, было б интересно.
Ничего сложного, просто надумалось оставить это здесь для школьников, может кому-нибудь пригодится.
Это что же теперь на каждую функцию WinAPI писать по посту на Хабре?
Не кроссплатформенно… Почему не используете готовые движки?
Для OGRE примерно так выходит.
int minitoCount = root->getDisplayMonitorCount();
StringVector videoModes = renderSystem->getConfigOptions()["Video Mode"].possibleValues;
Ага, чтоб монитор задетектить огр подгрузим…
А чтобы написать парсер, к примеру, подгрузим Boost::Spirit… Да-да именно так и поступаю, лучше куча года, чем свой велосипед.
Было бы интереснее ещё узнать, как определить физическое соотношение сторон монитора, т.к. разрешение не всегда ему соответствует. А то сейчас приходится выковыривать эти данные из EDID монитора в реестре, что не очень-то здорово.
Давай третий, он точно будет волжебным!
Оказывается на хабре посты двоятся время от времени 0_o
Занимался этим вопросом около года назад. Насколько я понял, ковыряние в EDID — самый популярный способ под Виндой. Хотя на цивилизованный он не похож совершенно.
я хочу простой и понятной фичи:
move2screen

чтож мне костылями то…
мои 5 копеек
for I := 0 to Screen.MonitorCount - 1 do ShowMessage(IntToStr(Screen.Monitors[I].MonitorNum));
Хоть бы рассказали где нашли эти 5 копеек, а то «НЛО прилетело и оставило это тут».
на Delphi это, старый добрый )
В теме о C++? Логично.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории