|
Вопрос # 2 153/ вопрос открыт / |
|
Здравствуйте!!! Помогите мне пожалуйста. я создаю программу-будильник. Вроде всё сделал: часы, будильник, звук. Как мне перейти в спящий режим и выключть компьютер? Заранее благодарен!!!
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: kuan (статус: Посетитель)
Вопрос отправлен: 3 декабря 2008, 19:17
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Ученый
Здравствуйте, kuan! Этот вопрос уже неоднократно поднимался, просто надо было воспользоваться поиском.
Используйте вот этот код в приложении. Просто выберите нужный вам флаг и всего.
Приложение: Переключить в обычный режим- function SetPrivilege(aPrivilegeName: string;
- aEnabled: boolean): boolean;
- var
- TPPrev,
- TP: TTokenPrivileges;
- Token: THandle;
- dwRetLen: DWord;
- begin
- Result := False;
- OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
- or TOKEN_QUERY, Token);
-
- TP.PrivilegeCount := 1;
- if (LookupPrivilegeValue(nil, PChar(aPrivilegeName),
- TP.Privileges[0].LUID)) then
- begin
- if (aEnabled) then
- TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
- else
- TP.Privileges[0].Attributes := 0;
-
- dwRetLen := 0;
- Result := AdjustTokenPrivileges(Token, False, TP,
- SizeOf(TPPrev),
- TPPrev, dwRetLen);
- end;
- CloseHandle(Token);
- end;
-
- function WinExit(iFlags: integer): boolean;
-
- // EWX_LOGOFF
- // EWX_REBOOT
- // EWX_SHUTDOWN
- // EWX_FORCE
- begin
- Result := True;
- if (SetPrivilege('SeShutdownPrivilege', true)) then
- begin
- if (not ExitWindowsEx(iFlags, 0)) then
- begin
- Result := False;
- end;
- SetPrivilege('SeShutdownPrivilege', False)
- end
- else
- begin
- Result := False;
- end;
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
-
-
 |
Ответ отправил: Ученый (статус: 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);
Приложение: Переключить в обычный режим- ...
-
- implementation
-
- {$R *.dfm}
-
- function SetSuspendState(Hibernate, ForceCritical,
- DisableWakeEvent: BOOL):BOOLEAN;stdcall;external 'Powrprof.dll';
-
- ...
 |
Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 3 декабря 2008, 22:26
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 4 декабря 2008, 15:52; участников в обсуждении: 2.
|
Amidamaru (статус: 4-ый класс), 3 декабря 2008, 21:57 [#1]:
EWX_REBOOT это не спящий режим
|
|
Ученый (статус: 8-ой класс), 4 декабря 2008, 15:52 [#2]:
Ну и SetSuspendState не выключение компьтера!!! Просто перепутал флаг. Вообще существуют флаги:
/ EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
// EWX_FORCE
Выбирайте нужный и всё...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|