Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.015 c
2-1166689691
Draught
2006-12-21 11:28
2007.01.14
Два знака после запятой QReport


15-1166470318
Kolan
2006-12-18 22:31
2007.01.14
А как установить поддержку азиатских языков в Windows?


2-1166773983
apot
2006-12-22 10:53
2007.01.14
serv tom RN01.DBF


2-1166914421
Германн
2006-12-24 01:53
2007.01.14
Тип целого для результата вычислений


1-1163769851
amg_
2006-11-17 16:24
2007.01.14
Вопрос по "вложенным" классам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский