Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват закрытия приложения [D6, WinXP]


webpauk ©   (2006-12-25 13:09:00) 

Подскажите как перехватить закрытие приложения и изъять его handle.
Пример очень желателен


trubin   (2006-12-25 15:17:00) [1]

А как ты отлавливаешь открытие? Если запускаешь сам, или периодически перебираешь процессы, то у тебя есть ИД процесса, если перебираешь окна, то по хендлу окна с помощью GetWindowThreadProcessId опять можно получить ИД процесса, по ИД получаешь хэндл процесса, и ставишь на ожидание в отдельном потоке WaitForSingleObject или WaitForMultipleObjects.

Если интересующих окон несколько в одном процессе, то тогда SetWindowsHookEx + WH_SHELL + HSHELL_WINDOWDESTROYED, ну ДЛЛ-ку конечно писать придется.

В инете по хукам масса информации в т.ч. и с примерами.


Сергей М.   (2006-12-25 14:41:00) [2]


> webpauk   (25.12.06 14:36) [15]


Там и найдешь и "конкретно" и не очень.


webpauk   (2006-12-25 14:36:00) [3]


> Сергей М. ©   (25.12.06 14:35) [14]


гугль с яндехом хороши, а мне надо конкретно на закрытие. вот и прошу пример


Сергей М.   (2006-12-25 14:35:00) [4]

На этом сайте в статьях вроде бы имеются примеры инсталляции глоб.хуков.

Да и гугль со справкой еще не усохли - см. SetWindowsHookEx


webpauk   (2006-12-25 14:32:00) [5]


> trubin ©   (25.12.06 14:25) [11]

окна чужой программы.


> Сергей М. ©   (25.12.06 14:25) [10]


если не тяжело пример


Сергей М.   (2006-12-25 14:32:00) [6]


> trubin ©   (25.12.06 14:25) [11]


Окна экземпляров виндового калькулятора он пасёт)


trubin   (2006-12-25 14:25:00) [7]

Окон твоей программы ?


Сергей М.   (2006-12-25 14:25:00) [8]

Таким же образом, каким и "открытие окон" - установкой хука на эти конкретные события.


webpauk   (2006-12-25 14:21:00) [9]


> Сергей М. ©   (25.12.06 14:19) [8]


конечно не имеет. Я вот и спрашиваю каким образом отловить закрытие окон?


Сергей М.   (2006-12-25 14:19:00) [10]


> чё делать с отловом закрытия


Сначала реализуй "отлов открытия".

А "отлов закрытия" практически ничем не отличается от "отлова открытия".

Твой код не имеет ничего общего с "отловом открытия".


webpauk   (2006-12-25 14:10:00) [11]

program FindCalc;

uses
 Windows;

{$R *.res}

const
 WM_SETTEXT = $000C;
var
 fLogEx: Boolean;

 fArr: array of THandle;

function FindCalcPrc(fWnd: HWND; fParam: Longint): Boolean;
var
 fWndEdit: THandle;
 fS: String;
 fI: Integer;
 fLog: Boolean;
begin
 fLog:=False;
 fS:= 'C Íîâûì ãîäîì, ïðèäóðîê!';

 fWnd:=FindWindow('SciCalc', nil);
 if fWnd0 then
 begin
   for fI := Low(fArr) to High(fArr) do
   begin
     if fArr[fI]=fWnd then
     begin
       fLog:=True;
       Break
     end;
   end;

   if not fLog then
   begin
     fWndEdit:=FindWindowEx(fWnd, 0, 'Edit', nil);
     if fWndEdit0 then
     begin
       SendMessage(fWndEdit, WM_SETTEXT, 0, Integer(fS));
     END;

     SetLength(fArr, Length(fArr)+1);
     fArr[Length(fArr)-1]:=fWnd;
   end;
 end;

 Result:= TRUE;
end;

begin
 while not fLogEx do
 begin
   Sleep(5);
   EnumWindows(@FindCalcPrc, 0)
 end;
end.


это основной модуль. чё делать с отловом закрытия  - еще не знаю


Сергей М.   (2006-12-25 14:02:00) [12]

Ты там хуки что ли сотворяешь  ?)


webpauk   (2006-12-25 14:00:00) [13]

суть задачи такова - во вновь открываемые окна, например Calc в поле Edit вставляется текст. Чтобы это не мешало дальнейшей работе handle окна заносится в список. при проверке всех окон данного classtype в такое окно больше ничего не передается. проблема в том, что после закрытия окна, новое окно может иметь тот же handle. Это надо исключить, путем перехвата закрытия окна приложения и определения его handle


Сергей М.   (2006-12-25 13:49:00) [14]


> изъять его handle
>
> - узнать.


У приложения куча хэндлов. Точнее с процессом приложения в ходе его работы система ассоциирует более чем один хендл. Какой из них требуется "узнать" ?


> ClasSType есть у формы


У формы нет никаких "ClasSType".


webpauk   (2006-12-25 13:42:00) [15]


> > изъять его handle

- узнать.

ClasSType есть у формы


Сергей М.   (2006-12-25 13:39:00) [16]


> изъять его handle


Что значит "изъять" ?


> ClassType приложения известен


У приложения нет никакого "ClassType".


webpauk   (2006-12-25 13:09:00) [17]

ClassType приложения известен


Наверх

Титульная страница Поиск, карта сайта Написать письмо