2010-08-19 5 views
1

Должно быть, было просто, я бы подумал. Я хочу заставить ПК перейти в режим экранной заставки и выйти из него, когда условия, на которые я проверяю D2006), станут реальностью. Он не работает:запуск и остановка заставки

if ScreenSaverExitRequested then 
     begin 
     SystemParametersInfoResult := SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @ScreenSaverIsRunning, 0); 
     if ScreenSaverIsRunning then 
      begin 
      SystemParametersInfoResult := SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, UINT(false), nil, SPIF_SENDWININICHANGE); 
      end ; 
     end ; 
.... 
    if ScreenSaverEntryRequested then 
     begin 
     SystemParametersInfoResult := SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, 1, nil, SPIF_SENDWININICHANGE) ; 
     end ; 

SystemParametersInfoResult возвращает true в каждом случае. Вызов SystemParametersInfo, похоже, не имеет никакого эффекта. Если я поместил ПК в режим SS, используя кнопку «Предварительный просмотр» в диалоговом окне «Свойства экрана панели управления», выполнение моего кода ничего не делает.

ответ

3

SPI_SETSCREENSAVEACTIVE фактически не запускает/останавливает заставку. Он предназначен для того, чтобы фактические заставки заставляли ОС знать, что они работают или выходят. Чтобы запустить скринсейвер, попробуйте отправить сообщение WM_SYSCOMMAND/SC_SCREENSAVE в окно GetDesktopWindow().

+0

Спасибо Реми. Чтобы пойти в другую сторону, есть ли соответствующее сообщение, чтобы выгнать его из режима скринсейвера? В настоящее время я использую 'Keybd_Event (VK_LCONTROL, 1, 0, 0); 'Keybd_Event (VK_LCONTROL, 1, KEYEVENTF_KEYUP, 0); и похоже работает нормально. – rossmcm

+1

Не особо, нет. Вы должны либо подделывать пользовательский ввод, как вы уже делали, либо вам нужно будет найти окно экранной заставки, а затем отправить сообщение WM_CLOSE. См. Этот FAQ: http://msdn.microsoft.com/en-us/magazine/cc301462.aspx. –

Смежные вопросы