Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2007, 18:42   #1
Yurazav
 
Регистрация: 06.11.2006
Сообщений: 4
По умолчанию Использование функции ExitWindowsEx.

В программировании я новичок, Delphi изучаю самостоятельно, поэтому многого не знаю. Прошу отнестись к моим вопросам снисходительно.
Моя дочь любит засыпать под музыку, подыматься ночью и выключать компьютер не охота, ругаться с ней я уже устал. Поэтому решил написать небольшую программку, которая выключала бы компьютер в заданное время. Ничего другого, кроме функции ExitWindowsEx не нашел, решил использовать эту функцию, но появились проблемы:
Если использовать флаг EWX_FORCE (должен выключить без сохранения) - не выключает, а перезагружает компьютер со сменой пользователя;
Если использовать флаг EWX_SHUTDOWN or EWX_POWEROFF(+ еще код с получением привилегий) – работает нормально, если нет запущенной программы. Если есть запущенная программа, которая требует сохранения, то появляется диалоговое окно, требующее подтверждения сохранения и естественно никакого автоматического выключения не происходит.
Поискал в литературе и в Internet – проблема получается в получении привилегий(у нас Windows XP SP2), но нигде не могу найти хорошего описания этих процессов. Подскажите, пожалуйста, книгу или справочник где хорошо описана работа получения этих привилегий и что это за привилегии? Спасибо.
Yurazav вне форума Ответить с цитированием
Старый 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
Yurazav
 
Регистрация: 06.11.2006
Сообщений: 4
По умолчанию

Спасибо за ответ, попробую разобраться с этим кодом. Конечно хотелось бы почитать литературу. О результатах сообщу.
Yurazav вне форума Ответить с цитированием
Старый 21.05.2007, 09:24   #4
Yurazav
 
Регистрация: 06.11.2006
Сообщений: 4
По умолчанию

Разобрался с получением привилегий, в основном. Но проблему это не сняло. Код, который я использую - рабочий, просто флаг EWX_FORCE один не ставится, а ставится EWX_SHUTDOWN or EWX_FORCE и все работает, но без сохранения. А хотелось чтобы программа сохраняла открытый документ, я думал, что это сделает функция ExitWidowsEx (с флагом EWX_SHUTDOWN or EWX_POWEROFF), но, наверное, в ней нет такой возможности.
Чтобы программно нажать кнопку ОК в диалоговом окне и этим сохранить открытый документ решил использовать функции FindWindowEx и SendMessage или SendDlgItemMessage (до конца еще не разобрался), при этом, наверное, придется создавать поток. Подскажите, в верном ли я направлении работаю?
Yurazav вне форума Ответить с цитированием
Старый 18.04.2010, 12:11   #5
makshimik
 
Регистрация: 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.
makshimik вне форума Ответить с цитированием
Старый 18.04.2010, 13:51   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

makshimik
Вы серьёзно думаете, что Yurazav в течение 3-х лет всё ещё не решил свою проблему и продолжает над ней биться?
Arigato вне форума Ответить с цитированием
Старый 21.04.2010, 03:55   #7
Vikenty
Заслуженный флудер
Участник клуба
 
Аватар для Vikenty
 
Регистрация: 31.03.2010
Сообщений: 1,473
По умолчанию

функция NtShutdownSystem из ntdll многовенно выключает компьютер, сохраняя только системные данные
Vikenty вне форума Ответить с цитированием
Старый 07.06.2010, 13:53   #8
makshimik
 
Регистрация: 13.10.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
makshimik
Вы серьёзно думаете, что Yurazav в течение 3-х лет всё ещё не решил свою проблему и продолжает над ней биться?
Но ведь вполне возможно, что кто-нибудь еще будет искать что-либо подобное. Так что не столь важно понадобится ответ автору темы или нет - он может понадобиться кому-то еще.
makshimik вне форума Ответить с цитированием
Старый 07.06.2010, 14:29   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
программку, которая выключала бы компьютер в заданное время.
Может для ТС уже не актуально, но кому то пригодится.
Вот программное выключение компьютера (корректное).
Определяете системное время и в нужное время запускаете процедуру (в принципе, процедуру можно "прикрутить" к любому событию) :
Код:
procedure off_PC;
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, hToken) then
  begin
    LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
      ExitWindowsEx(EWX_ShutDown,0);// Выключение
  end;
end;
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 07.06.2010, 16:26   #10
Rapid
Форумчанин
 
Аватар для Rapid
 
Регистрация: 01.09.2007
Сообщений: 747
По умолчанию

Зачем изобретать велосипед? Простая выключалка уже не работает? Скачать с оффсайта и программируй её как хочешь. Можно по событию (когда фильм кончится) или на время определеное. Зачем изучать для этого WIN API?
Ну да, чуть не забыл. Это ж для самообразования.
Никому не верьте.

Последний раз редактировалось Rapid; 07.06.2010 в 16:30.
Rapid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование *.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