Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

Перехват закрытия приложения   Найти похожие ветки 

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

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


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

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


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


> изъять его handle


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


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


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


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


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

- узнать.

ClasSType есть у формы


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


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


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


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


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


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

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


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

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


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

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 fWnd<>0 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 fWndEdit<>0 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:19) [8]


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


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

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

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


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


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


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


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

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


 
trubin ©   (2006-12-25 14:25) [11]

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


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


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


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


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


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

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


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


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


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

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

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


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


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


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


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


> webpauk   (25.12.06 14:36) [15]


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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
11-1143567562
Duber
2006-03-28 21:39
2007.01.14
В KOLmdvDBF не работает свойство LastUpdated


1-1164380543
BBCHa
2006-11-24 18:02
2007.01.14
Установка форматов в Excele


10-1127993555
BPK
2005-09-29 15:32
2007.01.14
TOLEContainer + MSWord = сохранить в память как HTML


15-1166554186
cando
2006-12-19 21:49
2007.01.14
пароли и имена подключений


15-1167046169
DelphiLexx
2006-12-25 14:29
2007.01.14
LPSolve IDE FOR Delphi, Симплекс метод