|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.05.2007, 18:42 | #1 |
Регистрация: 06.11.2006
Сообщений: 4
|
Использование функции ExitWindowsEx.
В программировании я новичок, Delphi изучаю самостоятельно, поэтому многого не знаю. Прошу отнестись к моим вопросам снисходительно.
Моя дочь любит засыпать под музыку, подыматься ночью и выключать компьютер не охота, ругаться с ней я уже устал. Поэтому решил написать небольшую программку, которая выключала бы компьютер в заданное время. Ничего другого, кроме функции ExitWindowsEx не нашел, решил использовать эту функцию, но появились проблемы: Если использовать флаг EWX_FORCE (должен выключить без сохранения) - не выключает, а перезагружает компьютер со сменой пользователя; Если использовать флаг EWX_SHUTDOWN or EWX_POWEROFF(+ еще код с получением привилегий) – работает нормально, если нет запущенной программы. Если есть запущенная программа, которая требует сохранения, то появляется диалоговое окно, требующее подтверждения сохранения и естественно никакого автоматического выключения не происходит. Поискал в литературе и в Internet – проблема получается в получении привилегий(у нас Windows XP SP2), но нигде не могу найти хорошего описания этих процессов. Подскажите, пожалуйста, книгу или справочник где хорошо описана работа получения этих привилегий и что это за привилегии? Спасибо. |
10.05.2007, 13:48 | #2 |
Форумчанин
Регистрация: 03.11.2006
Сообщений: 321
|
Вышеописанные примеры действительны только для w9x/Me. Дело в том, что, чтобы выполнить функциию в NT ОС, нужно получить права на выполнение этой функции. Сделать это можно через AdjustTokenPriviligies. С помощью нижеприведённой функции можно получить любую привелегию, в т.ч. и привеленгию SeShutdownPrivilege, которая нужна для разрешения функции ExitWindows(Ex) 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.Privilege s[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,dwR etLen); End; CloseHandle(Token); End; Пример использования для среды NT: SetPrivilege('SeShutdownPrivilege',True); ExitWindowsEx(EWX_SHUTDOWN,0); Автор: Song Взято из http://forum.sources.ru |
10.05.2007, 14:12 | #3 |
Регистрация: 06.11.2006
Сообщений: 4
|
Спасибо за ответ, попробую разобраться с этим кодом. Конечно хотелось бы почитать литературу. О результатах сообщу.
|
21.05.2007, 09:24 | #4 |
Регистрация: 06.11.2006
Сообщений: 4
|
Разобрался с получением привилегий, в основном. Но проблему это не сняло. Код, который я использую - рабочий, просто флаг EWX_FORCE один не ставится, а ставится EWX_SHUTDOWN or EWX_FORCE и все работает, но без сохранения. А хотелось чтобы программа сохраняла открытый документ, я думал, что это сделает функция ExitWidowsEx (с флагом EWX_SHUTDOWN or EWX_POWEROFF), но, наверное, в ней нет такой возможности.
Чтобы программно нажать кнопку ОК в диалоговом окне и этим сохранить открытый документ решил использовать функции FindWindowEx и SendMessage или SendDlgItemMessage (до конца еще не разобрался), при этом, наверное, придется создавать поток. Подскажите, в верном ли я направлении работаю? |
18.04.2010, 12:11 | #5 |
Регистрация: 13.10.2009
Сообщений: 5
|
Чтобы послать сообщение кнопке Ок Вам нужно использовать EnumChildWindows. Ниже пример ее использования. В качестве одного из параметров ей передается указатель на функцию, которая будет вызываться каждый раз, когда найдено дочернее окно. Данный пример находит все надписи на всех элементах управления в окне, найденном функцией FindWindow.
program Project1; {$APPTYPE CONSOLE} uses Windows,Messages,SysUtils; function GetChilds(Wnd:HWND; P:Pointer):BOOL; stdcall; var Text:array[0..256] of Char; Header:string; begin SendMessage(Wnd,WM_GETTEXT,word(256 ),longint(@Text)); Header:=PChar(@Text); writeln(Header,' ',Wnd); Result:=true; end; var h:hwnd=0; begin h:=FindWindow(nil,'сюда вписать заголовок искомого окна'); if h<>0 then EnumChildWindows(h,@GetChilds,0) else writeln('Your window not found'); readln; end. |
18.04.2010, 13:51 | #6 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,544
|
makshimik
Вы серьёзно думаете, что Yurazav в течение 3-х лет всё ещё не решил свою проблему и продолжает над ней биться? E-Mail: arigato.freelance@gmail.com
|
21.04.2010, 03:55 | #7 |
Заслуженный флудер
Участник клуба
Регистрация: 31.03.2010
Сообщений: 1,473
|
функция NtShutdownSystem из ntdll многовенно выключает компьютер, сохраняя только системные данные
|
07.06.2010, 13:53 | #8 |
Регистрация: 13.10.2009
Сообщений: 5
|
Но ведь вполне возможно, что кто-нибудь еще будет искать что-либо подобное. Так что не столь важно понадобится ответ автору темы или нет - он может понадобиться кому-то еще.
|
07.06.2010, 14:29 | #9 | |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Цитата:
Вот программное выключение компьютера (корректное). Определяете системное время и в нужное время запускаете процедуру (в принципе, процедуру можно "прикрутить" к любому событию) : Код:
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
|
07.06.2010, 16:26 | #10 |
Форумчанин
Регистрация: 01.09.2007
Сообщений: 747
|
Зачем изобретать велосипед? Простая выключалка уже не работает? Скачать с оффсайта и программируй её как хочешь. Можно по событию (когда фильм кончится) или на время определеное. Зачем изучать для этого WIN API?
Ну да, чуть не забыл. Это ж для самообразования.
Никому не верьте.
Последний раз редактировалось Rapid; 07.06.2010 в 16:30. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Использование *.swf | Романнн | Мультимедиа в Delphi | 14 | 02.04.2010 09:27 |
встроенные функции,использование записей и файлов | OLesechka300490 | Общие вопросы Delphi | 5 | 09.06.2008 08:41 |
использование TThread | amandra | Общие вопросы Delphi | 6 | 03.05.2008 03:13 |
Использование функции Excel из Delphi | Геля | Общие вопросы Delphi | 3 | 07.06.2007 07:33 |
Использование длл | Anatolij | Win Api | 1 | 02.01.2007 19:54 |