Бешенный Апач (hegan_gray) wrote,
Бешенный Апач
hegan_gray

Как я хотел сделать Presentation Director с блекджеком и шлюхами...

У меня есть ноут, Lenovo ThinkPad T61 (он же IBM). У него по комбинации клавиш Fn+F7 запускается прожка Presentation Director, которая может переключать схему изображений. Ну, то есть, на работе я хочу подключать монитор 1920х1680, стоящий справа от бука, дома 1280х1024, стоящий слева от бука, а где-нибу, например в институте, проектор 1024х768, стоящий над ноутом, и показывать на нём презентации на чистом экране без скринсейвера. Вот все эти схемки можно заранее в PDirector забить, а потом только нажимать заветную пару кнопок и выбирать нужную схемку.
Ну и вот, после обновления кучи дровей и софта от Леновы, перестал этот директор работать. Причём разные версии не работают по-разному, но кончается всё одним: не могу применить настройки, отвали от меня, мужик.
А винда при этом спокойно второй монитор подключает и не пикает. Но только долго это, каждый раз по экрану правой кнопкой щёлкать, выбирать вкладку, настраивать положение, разрешение, разширять на него рабочий стол...
Вообщем, решил я, что попробую написать свой Presentation Director.
Ага, как же...

Почитав MSDN, я попытался это сделать (пишу на Qt, но но WinAPI везде одинаковый):
#include <QtCore/QCoreApplication>
#include <qt_windows.h>
#include <stdio.h>
#include <iostream>
#include <QString>
#include <QStringList>
#include <QTextStream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream out(stdout, QIODevice::WriteOnly | QIODevice::Unbuffered);
    out << GetSystemMetrics(80) << endl;
    QString adapterDevName="", adapterName="";
    QStringList monitorDevNames, monitorNames;
    DISPLAY_DEVICE device;           // это структура для получения в неё данных об устройстве
    device.cb=sizeof(DISPLAY_DEVICE);
    if(EnumDisplayDevices(NULL, 0, &device, 0))  //получаю данные об адаптере
    {
        adapterDevName=QString::fromWCharArray(device.DeviceName, -1);
        adapterName = QString::fromWCharArray(device.DeviceString, -1);
        out << adapterDevName << endl << adapterName << endl << endl;

        int i=0;
        while (EnumDisplayDevices((WCHAR*)(adapterDevName.utf16()),i,&device,0)) 
            // получаю данные о мониторах адаптера пока они не кончатся
        {
            if (device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) //
                out << "DISPLAY_DEVICE_ATTACHED_TO_DESKTOP" << endl;    //
            if (device.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)    // вывожу
                out << "DISPLAY_DEVICE_MIRRORING_DRIVER" << endl;       // на экран
            if (device.StateFlags & DISPLAY_DEVICE_MODESPRUNED)         // флаги
                out << "DISPLAY_DEVICE_MODESPRUNED" << endl;            // устройства
            if (device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)      //
                out << "DISPLAY_DEVICE_PRIMARY_DEVICE" << endl;         //
            if (device.StateFlags & DISPLAY_DEVICE_REMOVABLE)           //
                out << "DISPLAY_DEVICE_REMOVABLE" << endl;              //
            if (device.StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE)      //
                out << "DISPLAY_DEVICE_VGA_COMPATIBLE" << endl;         //

            monitorDevNames << QString::fromUtf16((ushort*)(device.DeviceName), -1);
            monitorNames << QString::fromUtf16((ushort*)(device.DeviceString), -1);
            out << monitorDevNames.last() << endl << monitorNames.last() << endl << endl;
            i++;
        }
    }
    return a.exec();
}
_Winnie C++ Colorizer


Однако ничего особо путного не получается. Если внешний монитор к ноуту не подключать, или физически подключить, но не трогать его настроек через pop-up-меню рабочего стола, получаю следующее:
	1
	\\.\DISPLAY1
	Mobile Intel(R) 965 Express Chipset Family

	\\.\DISPLAY1\Monitor0
	Монитор по умолчанию

	\\.\DISPLAY1\Monitor1
	Монитор по умолчанию

	DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
	\\.\DISPLAY1\Monitor2
	ThinkPad Display 1680x1050

	\\.\DISPLAY1\Monitor3
	Монитор по умолчанию

Если же подключить монитор (обязательно попросить его расширить рабочий стол хотя бы), или потом отключить, но никак не дёргать его, то получаю следующее:
	1
	\\.\DISPLAY1
	Mobile Intel(R) 965 Express Chipset Family

	\\.\DISPLAY1\Monitor0
	Модуль подключения монитора

	\\.\DISPLAY1\Monitor1
	Монитор по умолчанию

	DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
	\\.\DISPLAY1\Monitor2
	ThinkPad Display 1680x1050

	\\.\DISPLAY1\Monitor3
	Модуль подключения монитора


Куда дальше копать, не знаю, есть суровые подозрения, что тут надо с драйвером взаимодействовать, а не хочется категорически. Может стоит потыкать винду палочкой на тему "а давай к этому монику подключимся"? Если не согласится, значит другой пробовать.

Подскажите, плиз, хотя бы в какую сторону копать. Хоть ключевые слова для поиска, потому что display monitor api win xp дают всё, что угодно, кроме нужного.
Tags: программистское
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments