Блуждая по закоулкам 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);
|