Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отследить завершение приложе или события WM_CLOSE 
:(
    Опции темы
_snikers_
  Дата 29.5.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.8.2004

Репутация: нет
Всего: нет



Здрасте! нужно отследить завершение приложения - если его закрыли, нужно выполнить некоторые действия... 
Пользуюсь функцией в таймере:
Код

function FindProcess(ExeName:string):string;
var
  PIDArray   : array [0..1023] of DWORD;
  cb         : DWORD;
  I          : Integer;
  ProcCount  : Integer;
  hMod       : HMODULE;
  hProcess   : THandle;
  ModuleName : array [0..1024] of Char;
begin
  Result := '';
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PIDArray[I]);
    if (hProcess <> 0) then
       begin
          EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
          GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
          if UpperCase(ExtractFileName(ModuleName))=UpperCase(ExeName) then Result:=ModuleName;
       end;
    CloseHandle(hProcess);
  end
end;

НО НЕ ПОДХОДИТ ПОТОМУ ЧТО

во время работы таймера постоянно моргает курсор мыши.. 
По-этому может возможно как-то сделать проверку по другому, или может быть перехватывать событие завершения приложения WM_DESTROY или WM_CLOSE... Пробовал установить хук на это событие но ничего не получается...
Код

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall; 
var 
 msg: PEVENTMSG; 
begin 
 if Code >= 0 then begin 
   result := 0; 
   msg := Pointer(LParam); 
   with Form1 do
     case msg.message of 
       WM_DESTROY: {или WM_CLOSE}
          BEGIN
          ...................
          END;
     end; 
 end else 
   result := CallNextHookEx(HookHandle, code, WParam, LParam); 
end;


 ГОСПОДА ПОМОГИТЕ.........
 
PM MAIL   Вверх
vv3
Дата 30.5.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 29.4.2006

Репутация: нет
Всего: нет



А просто отрабатывать необходимые по закрытии действия в событии onClose или onCloseQuery главной формы приложения недостаточно? Зачем такие сложности? 
PM MAIL   Вверх
Nickel
Дата 30.5.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Если мы сами запускаем приложение, то легче всего сделать так:
Код

procedure ExecAndWait;
var
  StartInfo  : TStartupInfo;
  ProcInfo   : TProcessInformation;
  CreateOK   : Boolean;
begin
  FillChar(StartInfo,SizeOf(TStartupInfo),#0);
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
  StartInfo.cb := SizeOf(TStartupInfo);
  CreateOK := CreateProcess('наше приложение',nil, nil, nil,False,
              CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS,
              nil, nil, StartInfo, ProcInfo);
  if CreateOK then begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    MessageBox(0,'Процесс завершился','',0);
    end;
end;

...

var a:cardinal;
begin
CreateThread(nil,0,@ExecAndWait,nil,0,a);
end;

Если не сами, то:
Код


uses TlHelp32;

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;

procedure OpenAndWait;
var h:THandle;
begin
  h := OpenProcess(PROCESS_ALL_ACCESS, False, GetProcessId('наше прилодение'));
  if h<>0 then
    begin
    WaitForSingleObject(h, INFINITE);
    MessageBox(0,'Процесс завершился','',0);
    end
  else MessageBox(0,'Возможно процесс не запущен','',0);
end;

...

var a:cardinal;
begin
CreateThread(nil,0,@OpenAndWait,nil,0,a);
end;

Чтобы наше приложение (если оно оконное) не "зависло", убираем запуск и ожидание в отдельный поток. Да ещё я не понял, что не так с таймером? 
PM   Вверх
_snikers_
Дата 30.5.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.8.2004

Репутация: нет
Всего: нет



Что значит: убираем запуск и ожидание в отдельный поток

и приложение не мое, а чужое отслеживаю....  
PM MAIL   Вверх
Nickel
Дата 31.5.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Это значит, что если у тебя приложение оконное, и ты сделаешь так:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenAndWait;
end;

То твоя форма благополучно зависнет, пока не завершится приложение, потому что
Код

WaitForSingleObject(h, INFINITE);

останавливает поток в котором идёт обработка сообщений формы. А если мы сделаем так:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
CreateThread(nil,0,@OpenAndWait,nil,0,a);
end;

Т.е. создадим новый поток, в котором и будет происходить ожидание завершения работы некоторгоо приложения. 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.