Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 10.10.2019
Сообщений: 12

Автоматизация установки нужного положения монитора и частоты обновления после перезагрузки ОС Windows 10

06.08.2023, 23:49. Показов 731. Ответов 0

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Очень уж надоело вручную менять положение и герцовку мониторов в системе с более,чем одним монитором каждый раз после перезагрузки ОС, поэтому решил написать данный код. На данный момент он умеет устанавливать выбранному монитору определённое разрешение и частоту обновления, после чего успешно сохраняет эти данные в текстовый файл после согласия пользователя. Для каждого монитора можно задать отдельные значения, они все хранятся в одном файле и новая информация по уже записанному в файл монитору перезаписывает старую, не затрагивая остальную. Я не профессиональный программист, в подобном коде я увидел возможность научиться чему-то новому. Но на данный момент моих знаний не хватает для дополнения функционала. Как написано в шапке, этот код должен автоматизировать изменение частоты обновления и положения монитора. Часть функционала уже есть. Теперь нужно как-то сделать возможность выбрать положение монитора, которое будет записано в тот же самый файл (У меня, например, два монитора. Первый монитор находится над вторым. В системе это так и обозначено. Но после перезагрузки или релогина мониторы меняют свою последовательность так, что первый находится слева от второго). После чего, как я предполагаю, нужно будет написать отдельное приложение, которое будет брать все данные из этого текстового файла, применяя эти настройки. Ну и, соответственно, это самое второе приложение уже будет поставлено в автозагрузку Windows, чтобы при запуске всё выставлялось как указано в файле.
Если у Вас есть какие-либо идеи или вы знаете, как можно улучшить код, то напишите, пожалуйста.
Вот сам код:

Кликните здесь для просмотра всего текста
Python
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
import os
import win32api
import win32con
import questionary
 
class MonitorInfo:
    def __init__(self, name, device, width, height):
        self.name = name
        self.device = device
        self.width = width
        self.height = height
 
def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')
 
def get_monitors():
    monitors = []
    device = win32api.EnumDisplayDevices(None, 0)
    i = 0
    while True:
        try:
            device_name = device.DeviceName
            if device_name:
                mode = win32api.EnumDisplaySettings(device.DeviceName, win32con.ENUM_CURRENT_SETTINGS)
                monitors.append(MonitorInfo(device_name, device.DeviceName, mode.PelsWidth, mode.PelsHeight))
            i += 1
            device = win32api.EnumDisplayDevices(None, i)
        except:
            break
    return monitors
 
def get_supported_resolutions(monitor_device):
    resolutions = {}
    i = 0
    while True:
        try:
            mode = win32api.EnumDisplaySettings(monitor_device, i)
            resolution = (mode.PelsWidth, mode.PelsHeight)
            frequency = mode.DisplayFrequency
 
            # Проверяем, что разрешение поддерживается монитором
            if resolution[0] > 0 and resolution[1] > 0:
                if resolution in resolutions:
                    resolutions[resolution].add(frequency)
                else:
                    resolutions[resolution] = {frequency}
            i += 1
        except:
            break
    return resolutions
 
def get_closest_resolution(target_width, target_height, target_frequency, monitor_width, monitor_height, resolutions):
    min_distance = float('inf')
    closest_resolution = None
 
    for resolution, frequencies in resolutions.items():
        width, height = resolution
        for frequency in frequencies:
            distance = abs(width - target_width) + abs(height - target_height) + abs(frequency - target_frequency)
 
            # Учитываем только те разрешения, которые имеют близкое соотношение сторон к монитору
            if abs(width / height - monitor_width / monitor_height) < 0.1:
                if distance < min_distance:
                    min_distance = distance
                    closest_resolution = resolution, frequency
 
    return closest_resolution
 
def change_screen_resolution(width, height, frequency, monitor_device):
    devmode = win32api.EnumDisplaySettings(monitor_device, win32con.ENUM_CURRENT_SETTINGS)
    devmode.PelsWidth = width
    devmode.PelsHeight = height
    devmode.DisplayFrequency = frequency
    win32api.ChangeDisplaySettingsEx(monitor_device, devmode)
 
def save_resolution_info(selected_monitor, width, height, frequency):
    monitor_info = {
        "Монитор": selected_monitor.name,
        "Разрешение": f"{width}x{height}",
        "Частота обновления": f"{frequency}Hz"
    }
    
    updated_info = False
    with open("monitors.txt", "r") as file:
        lines = file.readlines()
        for i in range(len(lines)):
            if lines[i].startswith("Монитор:") and selected_monitor.name in lines[i]:
                updated_info = True
                lines[i:i+4] = [f"{key}: {value}\n" for key, value in monitor_info.items()]
                break
    
    if not updated_info:
        with open("monitors.txt", "a") as file:
            for key, value in monitor_info.items():
                file.write(f"{key}: {value}\n")
            file.write("\n")
    else:
        with open("monitors.txt", "w") as file:
            file.writelines(lines)
 
def select_resolution(selected_monitor):
    clear_screen()
    print(f"Выбранный монитор: {selected_monitor.name}\n")
 
    supported_resolutions = get_supported_resolutions(selected_monitor.device)
    resolutions_choices = [
        f"{resolution[0]}x{resolution[1]}"
        for resolution in sorted(supported_resolutions.keys(), key=lambda x: x[0] * x[1], reverse=True)
    ]
    resolutions_choices.append("Назад")
    selected_resolution_str = questionary.select("Выберите разрешение:", choices=resolutions_choices).ask()
 
    if selected_resolution_str == "Назад":
        return
 
    width, height = map(int, selected_resolution_str.split("x"))
 
    # Проверяем, что выбранное разрешение является корректным
    if (width, height) not in supported_resolutions:
        (width, height), _ = get_closest_resolution(width, height, 60, selected_monitor.width, selected_monitor.height, supported_resolutions)
        print(f"Выбранное разрешение некорректно и будет заменено на ближайшее корректное: {width}x{height}")
 
    clear_screen()
    print(f"Выбранный монитор: {selected_monitor.name}")
    print(f"Выбранное разрешение: {width}x{height}\n")
 
    select_frequency(selected_monitor, width, height)
 
def select_frequency(selected_monitor, width, height):
    supported_resolutions = get_supported_resolutions(selected_monitor.device)
    supported_frequencies = supported_resolutions[(width, height)]
 
    frequencies_choices = sorted(list(supported_frequencies), reverse=True)
    frequencies_choices.append("Назад")
    selected_frequency_str = questionary.select("Выберите частоту обновления:", choices=[str(freq) for freq in frequencies_choices]).ask()
 
    if selected_frequency_str == "Назад":
        return
 
    frequency = int(selected_frequency_str)
 
    clear_screen()
    print(f"Выбранный монитор: {selected_monitor.name}")
    print(f"Выбранное разрешение: {width}x{height}")
    print(f"Выбранная частота обновления: {frequency}Hz\n\n")
 
    change_screen_resolution(width, height, frequency, selected_monitor.device)
 
    save_option = questionary.confirm("Сохранить информацию об измененных настройках?").ask()
 
    if save_option:
        save_resolution_info(selected_monitor, width, height, frequency)
 
    input("Для продолжения нажмите Enter...")
    select_resolution(selected_monitor)
 
if __name__ == "__main__":
    while True:
        clear_screen()
        monitors = get_monitors()
        monitor_choices = [f"{monitor.name} ({monitor.width}x{monitor.height})" for monitor in monitors]
        monitor_choices.append("Выход")
        selected_monitor_str = questionary.select("Выберите монитор:", choices=monitor_choices).ask()
 
        if selected_monitor_str == "Выход":
            break
 
        selected_monitor_index = monitor_choices.index(selected_monitor_str)
        selected_monitor = monitors[selected_monitor_index]
 
        select_resolution(selected_monitor)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2023, 23:49
Ответы с готовыми решениями:

После перезагрузки, затребованной Центром обновления для начала установки обновления, установка не начинается
Центр обновления Windows все время требует перезагрузки для установки обновления. Перезагружаюсь, но ничего не устанавливается, не...

Неожиданные перезагрузки системы после установки Windows 10 вместо Windows 8
Добрый вечер кибер шаманы! Кто может помочь. Стояла восьмерка, ни разу комп не делал экстренного завершения работы, поставил недавно 10ку,...

Не запускается Windows после установки обновления
Добрый вечер! После установки обновления не запускается Windows. Помогите разобраться с логом и что можно предпринять

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2023, 23:49
Помогаю со студенческими работами здесь

Windows Server 2012 R2 откатывает любые установленные обновления после перезагрузки
Добрый день. После установки обновлений, с последующей перезагрузкой происходит откат этих обновлений. Пробовал разные варианты решения...

Компьютер не загружается, после первой перезагрузки во время установки Windows 7
Комп не грузится после первой перезагрузки во время установки Windows 7. На мониторе: ------------ ------------ ------------- 4th...

Windows 7 перестала загружаться после установки обновления KB4038777
Друзья, всем привет! Опять к вам… Сегодня установил обновление KB4038777 на Windows 7. После перезагрузки при появления логотипа винды...

После установки Windows 7 - не ставится родное разрешение монитора 1680х1050
установил windows7 столкнулся с проблемой разрешения монитора не ставится родное 1680 1050 помогите решить эту проблему

Не загружается Windows после отключения питания во время установки обновления
Обновления скачались и при выключении компьютера начали устанавливаться. Не дождавшись установки я выключил комп. После запуска он сам 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru