Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 07.12.2023
Сообщений: 4
1

Отключение монитора под Windows 10

07.12.2023, 13:32. Показов 975. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Задача такая... Есть видеостена из 5 мониторов, подключенных к серверу (две видеокарты), работают круглосуточно, но реально нужны в течении рабочего времени. Как написать программу, которая усыпляла мониторы в нерабочее время и пробуждала в рабочее, чтобы уменьшить износ мониторов. На сервере установлена Windows 10. Пробовал

Delphi
1
2
3
4
/// выключение монитора:
  SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
/// включение:
  SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
но это не работает.

Вариант со встроенной функцией энергосбережения Windows не подходит, т.к. засыпание мониторов в рабочее время недопустимо.

Если возможно решение, то желательно на Delphi.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2023, 13:32
Ответы с готовыми решениями:

Как включить автоматическое отключение компьютера под Windows 2000?
Вопрос может быть достаточно ламмерский, но тем не менее прошу помочь. Установил Винд2000 и теперь...

Отключение монитора
Нужен совет. Системник новый, а монитору лет наверно уже больше 10. Решил перейти с форточек на...

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

Отключение монитора
Иногда при работе отключается монитор, но система зависает тоже, так как если играет музыка, то в...

Отключение монитора
Здравствуйте. После обновления windows 10 до версии 2004, команда SendMessage(HWND_BROADCAST,...

11
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
07.12.2023, 13:53 2
Есть утилита XStarter.
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
07.12.2023, 14:11 3
Цитата Сообщение от droider Посмотреть сообщение
Есть утилита XStarter
В ней есть возможность задать требуемое действие, выбрав раздел "Питание" (Power)

Название: xstarter.png
Просмотров: 227

Размер: 9.2 Кб

И задать время по расписанию.

Установите на сервер. Вообще, рекомендую к использованию, т.к. много чего позволяет автоматизировать, и простенькая.

Архив во вложении. Сам пользуюсь этой версией.

Если не ошибаюсь, написана на Delphi.
Вложения
Тип файла: rar xStarter 1.9.4.91.rar (18.22 Мб, 7 просмотров)
0
0 / 0 / 0
Регистрация: 07.12.2023
Сообщений: 4
08.12.2023, 11:21  [ТС] 4
Скачал, установил. Возможно, что что-то не понял... пункт "Sleep" относится к компьютеру? Компьютер, в нашем случае сервер, усыплять нельзя. Попробовал настроить пункт "Monitor". Монитор выключается, но включаться отказывается. Потом в программе упомянут промежуток времени, что напоминает встроенную возможность Windows, а мне надо чтобы монитор засыпал и просыпался в установленное время, в перспективе с учетом выходных (праздничных) дней, когда при штатной работе мониторы могут вообще не включаться. Поэтому, если есть какие-то предложения, как это реализовать (засыпание/пробуждение), то рад буду поучиться. Спасибо.
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
08.12.2023, 12:13 5
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
пункт "Sleep" относится к компьютеру?
да, "спящий" режим.
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
а мне надо чтобы монитор засыпал и просыпался в установленное время
так, там можно задать расписание (по дням, по часам).
0
12 / 7 / 3
Регистрация: 08.06.2012
Сообщений: 89
09.12.2023, 16:50 6
у тебя видимо говнокод с форумов, первый параметр должен быть HWND_BROADCAST
0
Модератор
3749 / 2249 / 782
Регистрация: 15.11.2015
Сообщений: 8,959
09.12.2023, 18:25 7
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
Delphi
1
2
3
4
/// выключение монитора:
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
/// включение:
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
но это не работает.
У меня, на Windows 7 сработало. Delphi 7.

Добавлено через 3 минуты
С
Delphi
1
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
тоже монитор гаснет, но программа виснет. Кто-то не отвечает на сообщение, похоже.

Вот
Delphi
1
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
нормально сработал.
0
3759 / 2263 / 705
Регистрация: 29.05.2013
Сообщений: 9,613
11.12.2023, 01:01 8
Интересно, а вот простой физический выключатель уже не вариант использовать? В конце концов, можно же просто запитать мониторы от выключателя света в кабинете. Уходя, выключаете свет и мониторы выключатся. Пришли, включили свет и мониторы включились. К тому же, возможна нештатная ситуация, которую вы не сможете предусмотреть в своем расписании, а мониторы будут выключены.
0
0 / 0 / 0
Регистрация: 07.12.2023
Сообщений: 4
11.12.2023, 08:35  [ТС] 9
Вообще-то, если пошевелить мышь или нажать клавишу на клавиатуре, то монитор просыпается. Но, да, можно использовать выключатель (сетевой фильтр с выключателем). Правда, есть человеческий фактор: один, уходя, выключит, другой забудет.
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
11.12.2023, 10:12 10
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
Вообще-то, если пошевелить мышь или нажать клавишу на клавиатуре, то монитор просыпается.
Я подозреваю, что если вы его выключите программно, то он точно так же будет просыпаться.

Присоединяюсь к Пытливый - чем не устраивает даже банальный таймаут выключения монитора? Если кто-то пошевелит мышкой и монитор включится, то он снова погаснет по таймауту.
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
засыпание мониторов в рабочее время недопустимо.
Это так критично?
0
Модератор
9611 / 6218 / 2423
Регистрация: 21.01.2014
Сообщений: 26,522
Записей в блоге: 3
11.12.2023, 10:36 11
Цитата Сообщение от Alex_2023_12 Посмотреть сообщение
один, уходя, выключит, другой забудет
одного-другого расстрелятьдепремировать - остальные забывать перестанут.
0
0 / 0 / 0
Регистрация: 07.12.2023
Сообщений: 4
13.12.2023, 12:36  [ТС] 12
Доброго дня.

Delphi
1
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
нормально сработало, но

Delphi
1
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
не работает. Конечно, если пошевелить мышь или нажать клавишу на клавиатуре, монитор просыпается, но хотелось бы программно. При достижении установленного времени пробуждения на мониторе кратковременно появляется информация о порте подключения (HDMI) и всё, монитор продолжает спать. Кто-нибудь может подсказать в чем причина?

Добавлено через 3 часа 58 минут
И еще вопрос. Программа запущена, после запуска сминимизированна, как отловить, что монитор разбужен с помощью движения мыши или нажатия клавиши на клавиатуре? Надо, отловив момент пробуждения, активировать окно программы, чтобы она появилась поверх всех окон и при этом у меня должен запуститься второй таймер, который позволит принять решение о необходимости прекращения работы программы (останова) или, если ничего не делать, то возврат к выполнению программы (усыплению монитора)

Пока получилось что-то типа:

Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:=False;
Timer1.Enabled:=True;
Application.Minimize;
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
var
t: TTime;
begin
t:=Time;
ProgressBar1.Position:=ProgressBar1.Position-1;
if ProgressBar1.Position=0 then
  begin
  Timer2.Enabled:=False;
  Timer1.Enabled:=True;
  fstart:=False;
  fstop:=True;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'start.ini');
Start:=StrToTime(Fini.ReadString('work','start','08:00'));
Stop:=StrToTime(Fini.ReadString('work','stop','17:30'));
DTP1.Time:=Stop; //DateTimePicker
DTP2.Time:=Start;
fstart:=False;
fstop:=True;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
t: TTime;
begin
t:=Time;
if fstop and (((t>=Timeof(DTP1.Time)) and (t<StrToTime('23:59'))) or
             ((t>=StrToTime('00:00')) and (t<Timeof(DTP2.Time)))) then
  begin
  PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
  fstop:=False;
  fstart:=True;
  end;
if fstart and (t>=Timeof(DTP2.Time)) and (t<Timeof(DTP1.Time)) then
  begin
  if (DayOfWeek(Date) in [1,7]) and CheckBox1.Checked then exit;
{  PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1); не работат!!!}
  fstart:=False;
  fstop:=True;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=False;
Timer2.Enabled:=False;
Button2.Visible:=False;
Button1.Enabled:=True;
Progressbar1.Position:=0;
end;
0
13.12.2023, 12:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2023, 12:36
Помогаю со студенческими работами здесь

Отключение монитора
может кто знает команды для компа типа привод открыть монитор отключить и т.д. вот примерный код ...

Отключение монитора
Здравствуйте. У меня случилась такая проблема...Ни с того ни с сего монитор начал отключаться и не...

Хаотическое отключение монитора
Здравствуйте уважаемые господа! Проблема следующая...недавно начался отключаться монитор: -...

Отключение монитора из сети
Итак , кратко опишу свою проблему , в режиме простоя мой монитор издает высокочастотный писк ,...

Отключение заданного монитора
Можете подсказать что не так? Я писал код опираясь на это Turn off specific monitor Ошибка в...

Отключение второго монитора
Добрый день. Подскажите пожалуйста, как можно при помощи python включать и отключать второй...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru