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

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

Почему хук срабатывает несколько раз? [D5, Win95/98, WinXP]


Страницы:   1 2

guest_Dmitry ©   (2005-02-10 08:05:00) 

Ставлю ловушку WH_CBT, перехватываю сообщение HCBT_CREATEWND. В результате при создании окна хук срабатывает несколько раз. Почему так?


GuAV   (2005-02-10 18:12:00) [1]

Игорь Шевченко ©   (10.02.05 17:33) [30]

> Нет, можно менять размер, позицию и Z-order.


спасибо.


guest_Dmitry   (2005-02-10 17:43:00) [2]

Прошу прощения! Все получилось. Спасибо всем огромное. Торможу к вечеру.


Игорь Шевченко   (2005-02-10 17:33:00) [3]

GuAV ©   (10.02.05 17:23) [28]

Нет, можно менять размер, позицию и Z-order.


guest_Dmitry   (2005-02-10 17:28:00) [4]

GuAV ©   (10.02.05 16:45) [23]

исправил GetForegroundWindow() на
TCWPStruct(Pointer(lParam)^).hwnd

В результате получаю полтора десятка разных значений на открытие одного приложения.
А нужно, например, при запуске "Блокнота" получить notepad.exe.


GuAV   (2005-02-10 17:23:00) [5]


>  имеет право модифицировать данные в CreateParams и
> т.д.


Т.е. можно превратить WS_OVERLAPPEDWINDOW в WS_CHILDWINDOW ?


Игорь Шевченко   (2005-02-10 17:20:00) [6]


> HCBT_CREATEWND A window is about to be created. The system
> calls the hook procedure before sending the WM_CREATE or
> WM_NCCREATE message to the window


Ну, MS считает, что WM_NCCREATE может быть не послано.. Точнее, пишет, что считает, на самом деле оно посылается, сразу после WM_GETMINMAXINFO :)

Хук WH_CBT имеет право запретить создание окна, имеет право модифицировать данные в CreateParams и т.д.
Поэтому он посылается до любого сообщения, посланного окну, так как от его результатов зависит дальнейшее создание окна.


Digitman   (2005-02-10 17:01:00) [7]


> Игорь Шевченко ©   (10.02.05 16:53) [25]


Игорь, прокомментируй в данном случае свое видение фразы [1]..


Игорь Шевченко   (2005-02-10 16:53:00) [8]

Digitman ©   (10.02.05 08:52) [4]

Сергей, система вызывает хук WH_CBT один раз при создании окна, перед посылкой сообщения WM_NCCREATE.

С уважением,


GuAV   (2005-02-10 16:46:00) [9]

GuAV ©   (10.02.05 16:45) [23]
В прочем, в [21] я согласился уже,

Имелось ввиду в [20]


GuAV   (2005-02-10 16:45:00) [10]

guest_Dmitry   (10.02.05 14:30) [22]
   AssignFile(f, 'c:\report.txt');
   writeln(f, 'It is work');
   CloseFile(f);


А append или rewrite кто делать будет ?
В прочем, в [21] я согласился уже, что писать в файл лучше из осн. программы.

guest_Dmitry   (10.02.05 14:25) [21]
Нет, это handle of the foreground window. А окно которое создаётся это то окно которое получает WM_CREATE, т.е. его handle в TCWPStruct(Pointer(lParam)^).


guest_Dmitry   (2005-02-10 14:30:00) [11]

Переделал в такой вариант - в файл вообще ничего не пишется..


function CallWndProc(code : integer; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;
var
   AppWnd: HWND;  
   f: TextFile;
begin

 if code < 0 then
 begin
   Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
   Exit;
 end;

 if TCWPStruct(Pointer(lParam)^).message = WM_CREATE
 then
  begin
    AppWnd:= GetForegroundWindow();
    AssignFile(f, 'c:\report.txt');
    writeln(f, 'It is work');
    CloseFile(f);
  end;

 CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
 Result:= 0;

end;


guest_Dmitry   (2005-02-10 14:25:00) [12]

GuAV ©   (10.02.05 14:06) [19]

AppWnd:= GetForegroundWindow(); - тут я пытаюсь получить handle открываемого окна. Если я не прав, то поправьте пожалуйста.


GuAV   (2005-02-10 14:13:00) [13]

guest_Dmitry   (10.02.05 13:43) [18]
из dll?

Действительно, чтобы избежать попытки записывать в файл одновременно, проще писать из ехе.


GuAV   (2005-02-10 14:06:00) [14]


> hwnd одинаковые.


Вот эти

> AppWnd:= GetForegroundWindow();

скорее всего будут одинаковыми.

Какому окну посылается WM_CREATE и как это окно связанно с foreground window ?


guest_Dmitry   (2005-02-10 13:43:00) [15]

GuAV ©   (10.02.05 13:19) [15]

>А hwnd разные ? Может просто создаётся  15 окон ?

hwnd одинаковые.

>Так записать в файл, а SendMessage зачем ?

из dll?

GuAV ©   (10.02.05 13:26) [16]

Справку я имел в виду по WinAPI. Каюсь, код скопировал. Пытаюсь со справкой разобраться в нем.

Digitman ©   (10.02.05 13:31) [17]

консольные, думаю, не нужны.


Digitman   (2005-02-10 13:31:00) [16]


> guest_Dmitry   (10.02.05 13:15) [14]
> у меня задача стоит записать в файл имя запущеного приложения.


а если приложение консольное ? и не создает никаких окон ?


GuAV   (2005-02-10 13:26:00) [17]


> видимо справка древняя у меня.. поправил.


Ха, я понял.. это не справка древняя а код тупо скопирован из примера к статье. Статья хорошая, а вот код к ней - не очень, там ещё ошибка есть.


GuAV   (2005-02-10 13:19:00) [18]

guest_Dmitry   (10.02.05 13:03) [12]
но все равно получается, что хук срабатывает раз 15..


А hwnd разные ? Может просто создаётся  15 окон ?

guest_Dmitry   (10.02.05 13:15) [14]
у меня задача стоит записать в файл имя запущеного приложения.

Так записать в файл, а SendMessage зачем ?


guest_Dmitry   (2005-02-10 13:15:00) [19]

GuAV ©   (10.02.05 12:59) [11]

видимо справка древняя у меня.. поправил.

Digitman ©   (10.02.05 13:08) [13]

у меня задача стоит записать в файл имя запущеного приложения. Каким образом тогда передать значение в мое приложение?


Digitman   (2005-02-10 13:08:00) [20]


> все равно получается, что хук срабатывает раз 15


ну ты же поставил WH_CALLWNDPROC-хук ?
а чего ж ты хочешь тогда ?
все твои асинхронные Sendmessage в теле твоей CallWndProc-ф-ции опять же будут приводить к вызову хук-ф-ции, на то это хук (WH_CALLWNDPROC) и существует ...


Страницы:   1 2

Наверх

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