Привет, хацкер! Ты, наверно, уже написал
много прог, в том числе и с классным
интерфейсом в стиле [X]. Но часто бывает так:
написал прогу, как говорится, Best View 800×600, а у
юзера 1920×1200 и окно проги при таком
разрешении смотрится как картина “Белеет
парус одинокий” 🙂 Чтобы такого
гарантировано избежать, надо просто “на
ходу” сменить разрешение экрана, а по
выходу из проги восстановить прежнее. Моя
прога-пример создаёт список всех возможных
разрешений видюхи и позволяет переключать
их без перезагрузки. То же делает и винда, но
нужно лезть в свойства экрана вручную, что
прога, естественно, не может 🙂 Если монитор
разрешение не потянет — жми ESC, чтобы
восстановить первоначальное.

Прога написана на C++ Builder. После создания
приложения “File->New Application” на форму надо
поместить ComboBox.

//—————————————————————————
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//—————————————————————————
/* Структура, в которую будут записаны
данные о первичном
видеоадаптере (а видюх может быть и
несколько,
но эта прога такого не учитывает) */
DISPLAY_DEVICE ddev;
/* Для запоминания видеорежима по умолчанию
(текущего) */
DEVMODE default_mode;
/* Для считывания инфы о всех возможных
видеорежимах твоей видюхи 🙂 */
DEVMODE modes[300];
//—————————————————————————
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//—————————————————————————
void __fastcall TForm1::FormCreate(TObject *Sender)
{
/* Инициализируем структуры */
ddev.cb = sizeof(DISPLAY_DEVICE);
default_mode.dmSize = sizeof(DEVMODE);
for(int j=0; j<100; j++)
modes[j].dmSize=sizeof(DEVMODE);

/* Считываем информацию о первичном
видеоадаптере в системе */
EnumDisplayDevices(NULL, 0, &ddev, 0);

/* Считываем инфу о текущем видеорежиме (по
умолчанию) */
EnumDisplaySettings(ddev.DeviceName, ENUM_CURRENT_SETTINGS, &default_mode);

/* Считываем инфу о всех доступных видюхе
(НО НЕ МОНИТОРУ !) видеорежимах */
int i=0;
while(EnumDisplaySettings(ddev.DeviceName, i, &modes[i])) i++;

/* Пихаем инфу в ComboBox */
for(int j=0; j<i; j++)
{
ComboBox1->Items->Add(
AnsiString(j)+
AnsiString(" ")+
AnsiString(modes[j].dmPelsWidth)+
AnsiString("x")+
AnsiString(modes[j].dmPelsHeight)+
AnsiString(" ")+
AnsiString(modes[j].dmBitsPerPel)+
AnsiString(" bits ")+
AnsiString(modes[j].dmDisplayFrequency)+
AnsiString(" Hz")
);
}
}
//—————————————————————————
void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
{
/* Если картинка на мониторе пропала, т.е.
видюха тянет режим,
а монитор нет — жми ESC и всё вернётся к
дефолтам 🙂 */
if(Key == VK_ESCAPE) ChangeDisplaySettings(&default_mode, 0);
}
//—————————————————————————
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
/* аналогично, но если "фокус" на ComboBox
был потерян */
if(Key == VK_ESCAPE) ChangeDisplaySettings(&default_mode, 0);
}
//—————————————————————————
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
/* При выборе видеорежима в ComboBox — меняем его
*/
ChangeDisplaySettings(&modes[ComboBox1->ItemIndex], 0);
}
//—————————————————————————

P.S. Юзай на здоровье, а если кому хочешь его
подпортить — просто поменяй в проге
герцовку монитора герц так на 60 🙂

В структуре DEVMODE:
default_mode.dmFields=DM_DISPLAYFREQUENCY;
default_mode.dmDisplayFrequency=60;
ChangeDisplaySettings(&default_mode, 0);

При этом экран немного “уедет”, но в 90%
случаев глупый юзер только ручки монитора
подкрутит и продолжит сажать зрение с
удесятерённой силой 🙂

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…