Форум программистов, компьютерный форум, киберфорум
fair7
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Изменить разрешение экрана

Запись от fair7 размещена 07.03.2020 в 23:01
Показов 1262 Комментарии 0

У меня возникла необходимость часто менять разрешение экрана.
Но постоянно заходить в настройки - не удобно.
Решил написать программу для этого.(у windows 10 не работает)
Нажмите на изображение для увеличения
Название: PA3MEP gKPAHA.PNG
Просмотров: 607
Размер:	3.2 Кб
ID:	5982
Например, когда захожу на сайт Wikium - Тренажёр для мозга,
нужен размер 800х600, чтобы рисунок оптимально заполнял экран (а не маленько игровое окно).


((После выхода из программы все они восстанавливают предыдущий режим.))
BAPURHT 1 (PA3PUWEHUE gKPAHA 800x600).zip
1) Вариант, когда разрешение меняется при запуске на 800х600.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#define _WIN32_WINNT 0x0500 // Чтобы менять координаты рамки,она должна быть перед <windows.h>
#include <windows.h>
// Дескриптор консоли, обязательно надо инициализировать.
HANDLE hOut =  GetStdHandle( STD_OUTPUT_HANDLE );
 
//Узнать разрешение экрана
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана в пикселях
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана в пикселях
// Размещение окна
void ToPutWindow(short X=-5-1,short Y=-27-1)
{   SetWindowPos(GetConsoleWindow(),0,X,Y,0,0,SWP_NOSIZE);
}
void Blinking(int off=99)// Мерцание убрать
{   CONSOLE_CURSOR_INFO cci;
    cci.dwSize=off;
    cci.bVisible=false;
    SetConsoleCursorInfo(hOut,&cci);
}
void ScreenPermission(short x=1024,short y=768)
{
    DEVMODE md;
    ZeroMemory(&md, sizeof(md)); //обнуляем структуру md
    md.dmSize = sizeof(md);
    md.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
    md.dmPelsWidth = x;//800; // Нужно вписать поддерживаемою
    md.dmPelsHeight = y;//600; // Поддерживаемою монитором
    ChangeDisplaySettings(&md,NULL); //изменяем разрешение экрана
 
}
#include <conio.h>
#define gg  _getch()
int main()
{
    ScreenPermission(800,600);
    SetConsoleTitle("ESC   -   BbIXOD ");// Можно обойтись без этой строчки,
                                         // экран почти скрывается в право
    Sleep(1);// Чтобы успело нарисовать окно, прежде чем ставить окно
    ToPutWindow(790,-2),Blinking(99);
    gg;// это лень писать _getch()
    ScreenPermission(screenW,screenH);// Возвращаем прежний размер экрана
    return 0;
}
BAPURHT 2 ( PA3MEP gKPAHA (K7ABUWU+KUPU7UYA, WPUFT 10)).zip
2)Вариант, переключение клавишами через функцию _getch()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#define _WIN32_WINNT 0x0500 // Чтобы менять координаты рамки,она должна быть перед <windows.h>
#include <windows.h>
// Дескриптор консоли, обязательно надо инициализировать.
HANDLE hOut =  GetStdHandle( STD_OUTPUT_HANDLE );
void FontSize(short symbol_size=0)//Размер символа
{
    typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);
    HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");
    SETCONSOLEFONT SetConsoleFont = (SETCONSOLEFONT)GetProcAddress(hmod,"SetConsoleFont");
    SetConsoleFont(hOut,symbol_size);
}
//Узнать разрешение экрана
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана в пикселях
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана в пикселях
void Screen()
{   screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана в пикселях
    screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана в пикселях
}
void _YX(unsigned short Y=0,unsigned short X=0)// Позиция курсора, для символов
{   COORD coord = { X, Y };
    SetConsoleCursorPosition(hOut, coord);
}
void Color(int text,int ground=0)
{   SetConsoleTextAttribute( hOut,(ground<<4|text));//
}
// PA3MESEHUE OKHA
void ToPutWindow(short X=-5-1,short Y=-27-1)
{   SetWindowPos(GetConsoleWindow(),0,X,Y,0,0,SWP_NOSIZE);
}
void Blinking(int off=99)// Мерцание убрать
{   CONSOLE_CURSOR_INFO cci;
    cci.dwSize=off;
    cci.bVisible=false;
    SetConsoleCursorInfo(hOut,&cci);
}
void ScreenPermission(short x=1024,short y=768)
{
    DEVMODE md;
    ZeroMemory(&md, sizeof(md)); //обнуляем структуру md
    md.dmSize = sizeof(md);
    md.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
    md.dmPelsWidth = x; // Нужно вписать поддерживаемою
    md.dmPelsHeight = y; // Поддерживаемую монитором
    ChangeDisplaySettings(&md,NULL); //изменяем разрешение экрана
 
}
void UnwrapScreen()// Разстянуть экран
{   COORD NewSBSize;
    SMALL_RECT DisplayArea = {0, 0, 0, 0};
    NewSBSize = GetLargestConsoleWindowSize(hOut);
    SetConsoleScreenBufferSize(hOut,NewSBSize);
    DisplayArea.Right = NewSBSize.X - 1;
    DisplayArea.Bottom = NewSBSize.Y - 1;
    SetConsoleWindowInfo(hOut,TRUE,&DisplayArea);
}
CONSOLE_SCREEN_BUFFER_INFO csbInfo;// Чтобы узнать координаты каретки
void GetBufferChars(COORD *Chars)// Чтобы узнать размер буффера символов
{   GetConsoleScreenBufferInfo(hOut, &csbInfo);
    Chars->X = csbInfo.srWindow.Right - csbInfo.srWindow.Left + 1;
    Chars->Y = csbInfo.srWindow.Bottom - csbInfo.srWindow.Top + 1;
}
#define cls system("cls")
//#include "c:/MyLib/winconsole.h"
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
#define PP printf
#define gg  _getch()
//#include "c:/MyLib/p.h"
#define WINDOWS 6
typedef struct  {short X;short Y;} C00RD, *PC00RD;
C00RD cooXY[WINDOWS]={1366,768,
                      1280,720,
                      1024,768,
                       800,600,
                       640,480,
                       400,300};
void SetScreenPermission_YX(char number){ScreenPermission(cooXY[number].X,cooXY[number].Y);}
struct MENU
{
    #define HORIZONTAL 0
    //  Что выводить на экран (какие пределы)
    MENU(int regime)
    {
                      limits[0]=*(int*)"F1-F";
                      limits[1]=*(int*)" 1-9";
                      limits[2]=*(int*)" Q-O";
                      limits[3]=*(int*)" A-L";
                      limits[4]=*(int*)" Z-.";
                      limits[5]=*(int*)"  _ ";
 
        for(char number=WINDOWS;number--;)
        {
            if(number==regime)show(number,0);
            else show(number);
        }
    }
    void show(char number,char background=1)
    {
        if(!(number>=0&&number<WINDOWS))return;
        _YX(number,HORIZONTAL),
        Color(6,background),PP((char*)&limits[number]),
        Color(5,background),PP("%4i",cooXY[number].X),
        Color(3,background),PP("x"),
        Color(5,background),PP("%3i",cooXY[number].Y);
    }
    private:
    unsigned long long limits[WINDOWS];
};
 
int main()
{
    COORD Chars={0};// Сколько символов помещается по горизонтали и вертикали
    FontSize(10);
    ToPutWindow(0,-2),Blinking(99);
    UnwrapScreen(),GetBufferChars(&Chars);// Взять размер буффера экрана
 
    Color(0,01);cls;
 
   SetConsoleTitle("ynPAB^EHUE:                     ESC   -   BbIXOD ");
   // Определить, какой режим экрана:
   int regime=WINDOWS,
   screenWidth=GetSystemMetrics(SM_CXSCREEN);// Получить ширину экрана в пикселях
   for(;regime--;)
   {
       if(cooXY[regime].X==screenWidth)break;
   }
    MENU menu(regime);
    char last=regime,now;
 
// Работа с клавишами
    int key=gg,OK=1;
    if (key==27)OK=0;
    for(;;Sleep(1),ToPutWindow(-4,-2),UnwrapScreen(),key=gg)
    {
        if(!key){now=0,key=gg;}
        else
        {
            switch(tolower(key))
            {
                case 27:OK=0;break;// ESC
                case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
                case '!':case '@':case '#':case '$':case '%':case '^':case '&':case '*':case '(':
                now=1;break;
 
                case 'q':case 'w':case 'e':case 'r':case 't':case 'y':case 'u':case 'i':case 'o':
                case 169:case 230:case 227:case 170:case 165:case 173:case 163:case 232:case 233:
                case 137:case 150:case 147:case 138:case 133:case 141:case 131:case 152:case 153:
                now=2;break;
                         case '?':
                case 'a':case 's':case 'd':case 'f':case 'g':case 'h':case 'j':case 'k':case 'l':
                case 228:case 235:case 162:case 160:case 175:case 224:case 174:case 171:case 164:
                case 148:case 155:case 130:case 128:case 143:case 144:case 142:case 139:case 132:
                now=3;break;
 
                case 'z':case 'x':case 'c':case 'v':case 'b':case 'n':case 'm':case ',':case '.':
                case 239:case 231:case 225:case 172:case 168:case 226:case 236:case 161:case 238:
                case 159:case 151:case 145:case 140:case 136:case 146:case 156:case 129:case 158:
                now=4;break;
                case ' ':
                now=5; break;
            }
            if(!OK)break;
        }
        SetScreenPermission_YX(now),Sleep(1),menu.show(last),
        menu.show(now,0);
        last=now;
    }
    ScreenPermission(screenW,screenH);// Возвращаем прежний размер экрана
    return 0;
}
BAPURHT 3 ( PA3MEP gKPAHA (K7ABUWU+MbIWb, WPUFT 10)).zip
3)Вариант, мышкой стал возможен выбор разрешения экрана, исключил _getch().
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#define _WIN32_WINNT 0x0500 // Чтобы менять координаты рамки,она должна быть перед <windows.h>
#include <windows.h>
// Дескриптор консоли, обязательно надо инициализировать.
HANDLE hOut =  GetStdHandle( STD_OUTPUT_HANDLE );
void FontSize(short symbol_size=0)//Размер символа
{   typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);
    HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");
    SETCONSOLEFONT SetConsoleFont = (SETCONSOLEFONT)GetProcAddress(hmod,"SetConsoleFont");
    SetConsoleFont(hOut,symbol_size);
}
//Узнать разрешение экрана
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана в пикселях
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана в пикселях
void Screen()
{   screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана в пикселях
    screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана в пикселях
}
void _YX(unsigned short Y=0,unsigned short X=0)// Позиция курсора, для символов
{   COORD coord = { X, Y };
    SetConsoleCursorPosition(hOut, coord);
}
void Color(int text,int ground=0)
{   SetConsoleTextAttribute( hOut,(ground<<4|text));//
}
// Размещение окна
void ToPutWindow(short X=-5-1,short Y=-27-1)
{   SetWindowPos(GetConsoleWindow(),0,X,Y,0,0,SWP_NOSIZE);
}
void Blinking(int off=99)// Мерцание убрать
{   CONSOLE_CURSOR_INFO cci;
    cci.dwSize=off;
    cci.bVisible=false;
    SetConsoleCursorInfo(hOut,&cci);
}
void ScreenPermission(short x=1024,short y=768)
{   DEVMODE md;
    ZeroMemory(&md, sizeof(md)); //обнуляем структуру md
    md.dmSize = sizeof(md);
    md.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
    md.dmPelsWidth = x; // Нужно вписать поддерживаемою
    md.dmPelsHeight = y; // Поддерживаемую монитором
    ChangeDisplaySettings(&md,NULL); //изменяем разрешение экрана
}
void UnwrapScreen()// Разтянуть экран
{   COORD NewSBSize;
    SMALL_RECT DisplayArea = {0, 0, 0, 0};
    NewSBSize = GetLargestConsoleWindowSize(hOut);
    SetConsoleScreenBufferSize(hOut,NewSBSize);
    DisplayArea.Right = NewSBSize.X - 1;
    DisplayArea.Bottom = NewSBSize.Y - 1;
    SetConsoleWindowInfo(hOut,TRUE,&DisplayArea);
}
CONSOLE_SCREEN_BUFFER_INFO csbInfo;// Чтобы узнать координаты каретки
void GetBufferChars(COORD *Chars)// Чтобы узнать размер буффера символов
{   GetConsoleScreenBufferInfo(hOut, &csbInfo);
    Chars->X = csbInfo.srWindow.Right - csbInfo.srWindow.Left + 1;
    Chars->Y = csbInfo.srWindow.Bottom - csbInfo.srWindow.Top + 1;
}
#define cls system("cls")
//#include "c:/MyLib/winconsole.h"
#include <ctype.h>
#include <stdio.h>
#include <conio.h>
#define PP printf
#define gg  _getch()
 
#define WINDOWS 6
typedef struct  {short X;short Y;} C00RD, *PC00RD;
C00RD cooXY[WINDOWS]={1366,768,
                      1280,720,
                      1024,768,
                       800,600,
                       640,480,
                       400,300};
void SetScreenPermission_YX(char number){ScreenPermission(cooXY[number].X,cooXY[number].Y);}
struct MENU
{
    #define HORIZONTAL 0
    //  Чтобы выводить на экран (какие пределы)
    MENU(int regime)
    {
                      limits[0]=*(int*)"F1-F";
                      limits[1]=*(int*)" 1-9";
                      limits[2]=*(int*)" Q-O";
                      limits[3]=*(int*)" A-L";
                      limits[4]=*(int*)" Z-.";
                      limits[5]=*(int*)"  _ ";
 
        for(char number=WINDOWS;number--;)
        {
            if(number==regime)show(number,0);
            else show(number);
        }
    }
    void show(char number,char background=1)
    {
        if(!(number>=0&&number<WINDOWS))return;
        _YX(number,HORIZONTAL),
        Color(6,background),PP((char*)&limits[number]),
        Color(5,background),PP("%4i",cooXY[number].X),
        Color(3,background),PP("x"),
        Color(5,background),PP("%3i",cooXY[number].Y);
    }
    private:
    unsigned long long limits[WINDOWS];
};
struct// MouseOrKey
{
    INPUT_RECORD InRec;
    unsigned int                 X(){return InRec.Event.MouseEvent.dwMousePosition.X;}
    unsigned int                 Y(){return InRec.Event.MouseEvent.dwMousePosition.Y;}
    unsigned int       ButtonState(){return InRec.Event.MouseEvent.dwButtonState;}
    unsigned int ControlMouseState(){return InRec.Event.MouseEvent.dwControlKeyState;}
    unsigned int             Flags(){return InRec.Event.MouseEvent.dwEventFlags;}
    unsigned int  LeftKey:1,RightKey:1;
    unsigned int  EventType(){return InRec.EventType;}
 
    bool                   KeyDown(){return InRec.Event.KeyEvent.bKeyDown;}
}Event;
int main()
{
    COORD Chars={0};// Сколько символов помещается по горизонтали и вертикали
    FontSize(10);
    ToPutWindow(0,-2),Blinking(99);
    UnwrapScreen(),GetBufferChars(&Chars);// Взять размер буффера экрана
 
    Color(0,01);cls;
 
   SetConsoleTitle("ynPAB^EHUE:                     ESC   -   BbIXOD ");
   // Определить, каой режим экрана:
   int regime=WINDOWS,
   screenWidth=GetSystemMetrics(SM_CXSCREEN);// Получить ширину экрана в пикселях
   for(;regime--;)
   {
       if(cooXY[regime].X==screenWidth)break;
   }
    MENU menu(regime);
    char last=regime,now=regime;
 
// Работа с клавишами
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    SetConsoleMode(hIn, 24);// Без этой записи программа закроется при Ctrl+C
    C00RD mouse;
    unsigned char VirtualKey;
    for (unsigned long NumRead;Event.ControlMouseState()-0x1b0001;)
    {
        ReadConsoleInput(hIn,&Event.InRec,1,&NumRead);
        switch(Event.EventType())
        {
            case MOUSE_EVENT:
            {
                switch(Event.Flags())
                {
                    case 0://Одинарное нажатие клавиши мыши:  Event.X()   Event.Y()
                    if (Event.ButtonState() & 1||Event.ButtonState() & 2)
                        now=Event.Y(),mouse.Y=(Event.Y()+1)*36,mouse.X=Event.X()*24;
 
                }break;
            }//break;
            case KEY_EVENT:if(Event.KeyDown())
            {
                VirtualKey=Event.ControlMouseState();
//                switch(VirtualKey)
//                {
//
//                }
                if(VirtualKey>=59&&VirtualKey<=68)now=0;
                else if(VirtualKey>= 2&&VirtualKey<=14)now=1;
                else if(VirtualKey>=16&&VirtualKey<=27)now=2;
                else if(VirtualKey>=30&&VirtualKey<=40)now=3;
                else if(VirtualKey>=44&&VirtualKey<=54)now=4;
                else if(VirtualKey==57)now=5;
            }
            break;
        }
        if(last-now)
        {
            SetScreenPermission_YX(now),Sleep(1),menu.show(last),
            menu.show(now,0);
            last=now;
            Sleep(25),ToPutWindow(-4,-2),UnwrapScreen();
            SetCursorPos(mouse.X,mouse.Y);
        }
    }
    ScreenPermission(screenW,screenH);// Возвращаем прежний размер экрана
    return 0;
}
В этих алгоритмах я записывал строку как число в long long, хотел так попробовать
C++
1
limits[0]=*(int*)"F1-F".
Компилятор Code Block 13.12, Оптимизация на размер.
Размер шрифта был добавлен 36х24, как добавлял расскажу не здесь.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru