Как программно запустить скрин сейвер?
Как известно, в Windows существуют системные команды (system commands), которые поступают в окно в виде сообщения WM_SYSCOMMAND. Идентификатор конкретной команды размещается в параметре wParam. Существуют команды SC_MOVE (перемещение окна), SC_SIZE (масштабирование окна) и т. д. Все эти команды "умеет" обрабатывать стандартная оконная процедура DefWindowProc, нужно только вызвать её с соответствующими параметрами.
Теперь осталось рассказть, что в Windows существует команда SC_SCREENSAVE, инициирующая запуск выбранного пользователем скрин сейвера. Всё, что тербуется от нас - это передать эту команду в оконную процедуру. Для этой цели можно послать собственному окну сообщение WM_SYSCOMMAND, а можно даже вызвать DefWindowProc напрямую, например:
PostMessage(hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); |
или:
DefWindowProc(hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); |
В MFC указанные операции выполняются совершенно аналогично:
PostMessage(WM_SYSCOMMAND, SC_SCREENSAVE); |
или:
DefWindowProc(WM_SYSCOMMAND, SC_SCREENSAVE, 0); |
Осталось выяснить, что делать, если наше приложение вообще не создаёт окно. Оказывается, сгодится и окно рабочего стола (получить его HWND можно с помощью функции GetDesktopWindow), например:
|