Главная страница
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.047 c
15-1166209801
menart
2006-12-15 22:10
2007.01.14
Линия тренда и получение формулы


2-1166926153
Drashka
2006-12-24 05:09
2007.01.14
Сравнение с типом данных Variant


1-1164379420
Krants
2006-11-24 17:43
2007.01.14
Сравнение строк


15-1166725252
alexsis
2006-12-21 21:20
2007.01.14
Чё за фигня с этими часами??


15-1166548775
Kerk
2006-12-19 20:19
2007.01.14
Двухлетие Кладовки