Привет, хацкер! Ты, наверно, уже написал
много прог, в том числе и с классным
интерфейсом в стиле [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

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…