Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 153

/ вопрос открыт /

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

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

kuan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: kuan (статус: Посетитель)
Вопрос отправлен: 3 декабря 2008, 19:17
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Ученый

Здравствуйте, kuan! Этот вопрос уже неоднократно поднимался, просто надо было воспользоваться поиском.
Используйте вот этот код в приложении. Просто выберите нужный вам флаг и всего.

Приложение:
  1. function SetPrivilege(aPrivilegeName: string;
  2. aEnabled: boolean): boolean;
  3. var
  4. TPPrev,
  5. TP: TTokenPrivileges;
  6. Token: THandle;
  7. dwRetLen: DWord;
  8. begin
  9. Result := False;
  10. OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
  11. or TOKEN_QUERY, Token);
  12.  
  13. TP.PrivilegeCount := 1;
  14. if (LookupPrivilegeValue(nil, PChar(aPrivilegeName),
  15. TP.Privileges[0].LUID)) then
  16. begin
  17. if (aEnabled) then
  18. TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
  19. else
  20. TP.Privileges[0].Attributes := 0;
  21.  
  22. dwRetLen := 0;
  23. Result := AdjustTokenPrivileges(Token, False, TP,
  24. SizeOf(TPPrev),
  25. TPPrev, dwRetLen);
  26. end;
  27. CloseHandle(Token);
  28. end;
  29.  
  30. function WinExit(iFlags: integer): boolean;
  31.  
  32. // EWX_LOGOFF
  33. // EWX_REBOOT
  34. // EWX_SHUTDOWN
  35. // EWX_FORCE
  36. begin
  37. Result := True;
  38. if (SetPrivilege('SeShutdownPrivilege', true)) then
  39. begin
  40. if (not ExitWindowsEx(iFlags, 0)) then
  41. begin
  42. Result := False;
  43. end;
  44. SetPrivilege('SeShutdownPrivilege', False)
  45. end
  46. else
  47. begin
  48. Result := False;
  49. end;
  50. end;
  51.  
  52. procedure TForm1.Timer1Timer(Sender: TObject);
  53. begin
  54.  
  55.  


Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 3 декабря 2008, 19:35

Ответ #2. Отвечает эксперт: Amidamaru

Здравствуйте, kuan!
Очень интересный вопрос! Для перехода в "режим экономии энергии" (РЭЭ) используется функция SetSuspendState.
Для работы этой функции, её нужно объявить как показано в Приложении.
Параметры:
1) Hibernate:
насколько я понял, если True то переходит в Спящий Режим, если False - в Ждущий режим.
Но у меня скорее всего спящий режим отключён, поэтому в любом случае переходит в ждущий :)
2) ForceCritical:
"насильственный" переход в РЭЭ. Если false, то система разсылает сообщения WM_POWERBROADCAST с wParam = PBT_APMQUERYSUSPEND. Эти сообщения играю примерно туже роль что и WM_QUERYENDSESSION для ExitWindowsEx (советую ставить false а то мало ли ...)
3) DisableWakeEvent:
если True - отменяет все "события для пробуждения" (wake events)

использовать просто :)
SetSuspendState(false,false,false);

Приложение:
  1. ...
  2.  
  3. implementation
  4.  
  5. {$R *.dfm}
  6.  
  7. function SetSuspendState(Hibernate, ForceCritical,
  8. DisableWakeEvent: BOOL):BOOLEAN;stdcall;external 'Powrprof.dll';
  9.  
  10. ...


Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 3 декабря 2008, 22:26


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 4 декабря 2008, 15:52; участников в обсуждении: 2.
Amidamaru

Amidamaru (статус: 4-ый класс), 3 декабря 2008, 21:57 [#1]:

EWX_REBOOT это не спящий режим :)
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Ученый

Ученый (статус: 8-ой класс), 4 декабря 2008, 15:52 [#2]:

Ну и SetSuspendState не выключение компьтера!!! Просто перепутал флаг. Вообще существуют флаги:
/ EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
// EWX_FORCE
Выбирайте нужный и всё...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 20 февраля 2020, 12:18
Выполнено за 0.02 сек.
Рейтинг@Mail.ru