C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  Update World C++: Сборник GPL QT исходников
  Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Нетология

 40 - Управление питанием монитора с помощью WM_SYSCOMMAND / Win 32 API / Win32 API

Шаг 40 - Управление питанием монитора с помощью WM_SYSCOMMAND

Блуждая по закоулкам MSDN-а, наткнулся я, совершенно случайно, на сообщение WM_SYSCOMMAND, которое поразило меня богатством свойх возможностей. Оказывается, если послать WM_SYSCOMMAND главному окну, передав в качестве wParam один из нижеописанных параметров можно получить довольно интерестные эффекты.

Начну с параметра SC_MONITORPOWER, который позволяет управлять питанием монитора. В этом случае lParam при вызове функции SendMessage может принимать одно из значений приведенных в таблице:

lParamОписание
-1Переводит монитор в нормальный, рабочий режим
0Переводит монитор в режим "легкого" засыпания
1Переводит монитор в спящий режим
2Монитор выключается

Несмотря на то, что Microsoft описала только последние два значения, на практике (во всяком случае, в Win98) срабатывают все. Т.о. для выключения монитора в Вашей программе достаточно написать:

::SendMessage(AfxGetMainWnd()->m_hWnd, WM_SYSCOMMAND,
		SC_MONITORPOWER, 2);

И не забудьте в обработчик сообщений от клавиатуры или мыши добавить:

::SendMessage(AfxGetMainWnd()->m_hWnd, WM_SYSCOMMAND,
			SC_MONITORPOWER, -1);

как сделано в проекте-примере, иначе Вы не сможете вернуть монитор в прежнее состояние иначе как перезагрузкой!!!

А вот запустить программно скинсейвер можно с помощью SC_SCREENSAVE. Для этого параметра таблица значений выглядит так:

lParamОписание
0Активизирует скринсейвер
1Позволяет перейти в ждущий режим

Соответственно запустить хранитель экрана можно вызвав функцию:

::SendMessage(AfxGetMainWnd()->m_hWnd, WM_SYSCOMMAND,
			SC_SCREENSAVE, 0);

Ну и совсем уж неожиданный эффект - иммитация нажатия на кнопку "Пуск", которую выполняет SC_TASKLIST, причем lParam - любое число :

::SendMessage(AfxGetMainWnd()->m_hWnd, WM_SYSCOMMAND,
			SC_TASKLIST, 1);

Прислал Антон Рыбаков(anton_ryb@chat.ru)


| |
Автор Каев Артем.
[AD]





Letyshops [lifetime]