![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему хук срабатывает несколько раз? [D5, Win95/98, WinXP]
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) и существует ...