Russian Qt Forum

Программирование => Общий => Тема начата: gil9red от Февраль 24, 2013, 03:00



Название: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 03:00
Здравствуйте!

Дали задание сделать тестировщик windows

Требования к тестировщику:
  • Процессор: тип процессора, количество процессоров, поколение процессоров
  • Память: загрузка памяти, объем доступной оперативной памяти, объем свободной оперативной памяти, размер файла подкачки, максимальный размер памяти для процессов, свободная память для процессов
  • Видео: разрешение экрана, глубина цвета, частота обновления экрана, кадровая частота, виртуальный рабочий стол, размеры экрана, относительная ширина пикселя устр-ва, относительная высота пикселя устройства
  • Атрибуты диска: тип носителя, файловая система, метка тома, серийный номер тома, доступно памяти для пользователя, всего на диске байт?(в том числе занято и свободно)
  • Клавиатура: тип устр-ва, количество функциональных клавиш
  • Мышь: количество кнопок мыши, наличие ролика прокрутки, время двойного щелчка.
  • Система: операционная система, версия сборки, текущий пользователь, имя компа, системный каталог, каталог виндуса, режим загрузки

Подскажите как определить то что выделил красным :)

PS. виртуальный рабочий стол проверял через Qt: QDesktopWidget::isVirtualDesktop(), но не уверен что это правильно
PPS. Также с типом процессора и поколением непонятно, для определения типа использовал GetSystemInfo() и проверял поле dwProcessorType, для поколения  - поле wProcessorLevel, но и в этом не уверен
PPPS. Гугление показало что размер экрана не определить точно


Название: Re: Пару вопросов про winAPI
Отправлено: neversleep от Февраль 24, 2013, 11:16
PPS. Также с типом процессора и поколением непонятно, для определения типа использовал GetSystemInfo() и проверял поле dwProcessorType, для поколения  - поле wProcessorLevel, но и в этом не уверен
Вот небольшой пример от мс, в котором так же используется dwProcessorType для определения типа процессора: Getting Hardware Information (Windows) (http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms724423%28v=vs.85%29.aspx)

SYSTEM_INFO structure (Windows) (http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms724958%28v=vs.85%29.aspx)

Цитировать
dwProcessorType

    An obsolete member that is retained for compatibility. Use the wProcessorArchitecture, wProcessorLevel, and wProcessorRevision members to determine the type of processor.
---

PPPS. Гугление показало что размер экрана не определить точно
Код:
HDC dc = GetDC(GetDesktopWindow());
if (dc) {
cout << "Screen size: " << GetDeviceCaps(dc, HORZRES) << "x" << GetDeviceCaps(dc, VERTRES) << endl;
cout << "Refresh rate: " << GetDeviceCaps(dc, VREFRESH) << endl;
cout << "Bits/Pixel: " << GetDeviceCaps(dc, BITSPIXEL) << endl;
ReleaseDC(GetDesktopWindow(), dc);
}


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 11:38
Мой код определения типа процессора:
Код:
QString typeProcessor()
{
    SYSTEM_INFO systemInfo;
    GetSystemInfo(&systemInfo);

    QString type;

    switch(systemInfo.dwProcessorType)
    {
    case PROCESSOR_INTEL_386:
        type = "Intel 386";
        break;

    case PROCESSOR_INTEL_486:
        type = "Intel 486";
        break;

    case PROCESSOR_INTEL_PENTIUM:
        type = "Intel Pentium";
        break;

    case PROCESSOR_MIPS_R4000:
        type = "Mips R4000";
        break;

    case PROCESSOR_ALPHA_21064:
        type = "Alpha 21064";
        break;

    case PROCESSOR_INTEL_IA64:
        type = "Intel IA64";
        break;
    }

    return type;
}

neversleep, как вы видите про SYSTEM_INFO и GetSystemInfo я знаю. Просто не уверен что тип проца это именно то что написал...
Тогда что будет поколением процессора - wProcessorArchitecture? Но его я не могу использовать...

Цитировать
Код:
HDC dc = GetDC(GetDesktopWindow());
if (dc) {
cout << "Screen size: " << GetDeviceCaps(dc, HORZRES) << "x" << GetDeviceCaps(dc, VERTRES) << endl;
cout << "Refresh rate: " << GetDeviceCaps(dc, VREFRESH) << endl;
cout << "Bits/Pixel: " << GetDeviceCaps(dc, BITSPIXEL) << endl;
ReleaseDC(GetDesktopWindow(), dc);
}
Тут находится разрешение экрана, частота обновления и глубина цвета, мне же нужно частота кадров :)


Название: Re: Пару вопросов про winAPI
Отправлено: Serr500 от Февраль 24, 2013, 11:47
EnumDisplaySettings, член dmDisplayFrequency структуры DEVMODE.


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 12:59
Serr500, разве dmDisplayFrequency это не частота обновления? :)
Цитировать
dmDisplayFrequency
Specifies the frequency, in hertz (cycles per second), of the display device in a particular mode.


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 13:09
Что то мне кажется что размер экрана и кадровую частоту не определить :)


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 13:41
Смотрел программу-тестировщик WinAudit, она определяет размеры дисплея
Как через винапи определить/подсчитать эти размеры? :)


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 14:24
Кое что нашел :)

Диагональ моника можно определить так:
Код:
int horizontalSize;
int verticalSize;
int diagonal;

HDC dc = GetDC(NULL);

horizontalSize = GetDeviceCaps(dc, HORZSIZE);
verticalSize = GetDeviceCaps(dc, VERTSIZE);

diagonal = ( (sqrt ( pow(horizontalSize, 2) + pow(verticalSize, 2) ) ) / 10) / 2.54;



Название: Re: Пару вопросов про winAPI
Отправлено: Serr500 от Февраль 24, 2013, 15:05
Serr500, разве dmDisplayFrequency это не частота обновления? :)
Цитировать
dmDisplayFrequency
Specifies the frequency, in hertz (cycles per second), of the display device in a particular mode.
А разве это не одно и то же?


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 15:50
Все, туплю! Ночь, утро и день за программированием не прошел даром :)
Да, эти два понятия практически одинаковые, по крайней мере, вики говорит что это так


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 16:33
Кое что нашел :)

Диагональ моника можно определить так:
Код:
int horizontalSize;
int verticalSize;
int diagonal;

HDC dc = GetDC(NULL);

horizontalSize = GetDeviceCaps(dc, HORZSIZE);
verticalSize = GetDeviceCaps(dc, VERTSIZE);

diagonal = ( (sqrt ( pow(horizontalSize, 2) + pow(verticalSize, 2) ) ) / 10) / 2.54;

Лоханулся я, этот код не совсем правильный - у меня работает (19, 1024*768)


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 16:44
Через реестр ведь можно узнать всю интересующую инфу о железе??  :)


Название: Re: Пару вопросов про winAPI
Отправлено: kuzulis от Февраль 24, 2013, 18:41
WMI во все поля!  :)


Название: Re: Пару вопросов про winAPI
Отправлено: gil9red от Февраль 24, 2013, 21:23
WMI во все поля!  :)

Можно подробнее?)
желательно с кодом))) ;D


Название: Re: Пару вопросов про winAPI
Отправлено: kuzulis от Февраль 24, 2013, 21:32
В гугл. Он знает больше чем я.


Название: Re: Пару вопросов про winAPI
Отправлено: Bepec от Февраль 24, 2013, 22:32
WMIC же устанавливать вроде надо, не?