Хук на HCBT_CREATEWND |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Хук на HCBT_CREATEWND |
Unconnected |
13.09.2010 23:07
Сообщение
#1
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Привет всем
Надо поставить хук на создание окон. Нашел (и слегка модифицировал) такой код:
Я сделал перевод из pchar в string, до этого там была какая-то жутко тупая проверка, которая почему-то работала. Этот код, как я понял, распространяется только на моё приложение. hookhandle>=0. Сообщение отредактировано: Unconnected - 13.09.2010 23:13 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
13.09.2010 23:59
Сообщение
#2
|
Гость |
Хм. Интересно, куда подевались все вопросительные знаки? Ты хоть один видишь? Я почему-то нет. Вопрос-то в чем?
|
Unconnected |
14.09.2010 0:05
Сообщение
#3
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
В том, что код не работает как надо ) (по идее, при открытии блокнота блокнот не должен открыться).
Сообщение отредактировано: Unconnected - 14.09.2010 0:05 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 0:59
Сообщение
#4
|
Гость |
Цитата по идее, при открытии блокнота блокнот не должен открыться С чего бы это? Заголовок окна Блокнота создается при обработке WM_CREATE, а хук твой срабатывает до того, как Блокноту будет выслано сообщение WM_CREATE. Пользуйся WH_SHELL-ом, а не WH_CBT. |
Unconnected |
14.09.2010 1:22
Сообщение
#5
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Нуу.. я изменил code на WH_Shell, этого достаточно? Пока всё равно не ловит.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 1:35
Сообщение
#6
|
Гость |
Цитата этого достаточно? Нет, конечно. Но меня посетила шальная мысль: а чего бы тебе в твоем предыдущем коде не проверять результат GetClassName? Класс окна блокнота известен: "Notepad" (и менять его, вроде, MS не собирается). Попробуй. Вот эта информация должна быть известна уже ДО отсылки приложению WM_CREATE, класс-то уже создан... |
Unconnected |
14.09.2010 15:09
Сообщение
#7
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Дык это только в примере блокнот, может я ещё чего-нибудь запретить захочу, универсальность нужна..
Пошукал в msdn, кажется надо так примерно:
Так примерно надо?.. Сообщение отредактировано: Unconnected - 14.09.2010 15:10 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 16:25
Сообщение
#8
|
Гость |
Цитата может я ещё чего-нибудь запретить захочу, универсальность нужна Вот именно потому, что нужна универсальность - тебе и надо работать с классом окна, а не с заголовком. У некоторых окон ты вообще заголовок прочесть не сможешь, к примеру, он рисуется вручную, что делать будешь? Узнавай класс окна и запрещай его создание.Цитата Так примерно надо?.. Цитата hshell_language по мсдн должен возвращать хэндл окна Чего-чего он должен возвращать? Все, что в MSDN сказано - это то, что при Code = HSHELL_WINDOWCREATED, параметр wParam будет содержать хэндл окна. Получить по известному хэндлу заголовок сможешь? Получишь заголовок, посмотри, содержится ли в нем "Блокнот", и если да - то убивай окно, потому как WH_SHELL не может отменить создание, окно уже было создано. Отменить создание через Result = ненулевое_значение можно, когда ты перехватываешь HCBT_CREATEWND. Но тогда тебе нельзя работать с заголовком окна, он еще не создан Выбирай... |
Unconnected |
14.09.2010 16:31
Сообщение
#9
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Цитата Отменить создание через Result = ненулевое_значение можно, когда ты перехватываешь HCBT_CREATEWND. Но тогда тебе нельзя работать с заголовком окна, он еще не создан Я бы выбрал перехватывать HCBT_CREATEWND. В оригинале функция хорошо справлялась с завершением диалогов открытия. Но, раз хэндла нет, что мы в том случае можем получить, pid процесса? -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 17:21
Сообщение
#10
|
Гость |
Что значит, нет Хэндла? Я где-то тебе сказал про то ,что нет хэндла? Я сказал, что на момент перехвата HCBT_CREATEWND тебе не гарантируется наличие заголовка окна. Хэндл есть всегда, он содержится в wParam:
Цитата Code HCBT_CREATEWND wParam Specifies the handle to the new window. lParam Specifies a long pointer to a CBT_CREATEWND structure containing initialization parameters for the window. The parameters include the coordinates and dimensions of the window. By changing these parameters, a CBTProc hook procedure can set the initial size and position of the window. И что тебе это дало? Что будешь делать с хэндлом? Как определишь, что это именно блокнот, а не IE, скажем? |
Unconnected |
14.09.2010 17:27
Сообщение
#11
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
А у меня есть хитроумная функция, которая выдаст путь к файлу по хэндлу
Приблизительно получится понять, что запустилось.. Сообщение отредактировано: Unconnected - 14.09.2010 17:29 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 17:48
Сообщение
#12
|
Гость |
универсальность нужна.. иПриблизительно получится понять, что запустилось.. это взаимоисключающие параграфы. Вот возьму я, скопирую notepad.exe в другую папку под именем SuperPuper.exe, и где будет твоя универсальность, когда эта программа запускаться будет? Там же, где и твоя хитроумная функция приблизительно Не надо делать сложным то, что можно сделать просто. Имя класса окна вычисляется элементарно, для этого достаточно написать простенькую утилитку, и запустить один раз то приложение, которое будешь потом запрещать. Все, после этого никакие ухищрения с копированием EXE-файлов уже не проходят, приложение бракуется на другом уровне.Дело, конечно, твое, только ты ж потом опять придешь, когда выяснится, что программа не работает как нужно, и вместо того, чтоб переписать как надо, будешь опять наворачивать на своего монстра еще и еще кода. |
Unconnected |
14.09.2010 18:23
Сообщение
#13
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
И правда, по классу лучше определять.. что-то я не подумал) Тогда так:
Укоротил донельзя, а всё равно не того. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 18:27
Сообщение
#14
|
Гость |
Можешь прикрепить весь проект?
|
Unconnected |
14.09.2010 18:29
Сообщение
#15
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Он на "любимом" KOL... Надо? Но ловушка точно ставится, я проверял, проходит куча сообщений через неё.
И да, зеркальные классы не виноваты, я в них и с сообщениями работал, и с теми же ловушками когда-то.. added: сейчас воткнул функцию в обычный проект D2007 - то же самое. Сообщение отредактировано: Unconnected - 14.09.2010 18:34 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 19:10
Сообщение
#16
|
Гость |
Цитата а всё равно не того Ну, поскольку Дельфи у меня под рукой нет, и не будет до конца недели (ну полетел у меня компьютер, где были установлены Дельфи и Билдер, да и все остальное - тоже, сейчас я на старой машине, почти пустой, из программного обеспечения - только FF + FPC /который, как выяснилось, даже DLLProc не знает, блин, поделка для первокурсников, пишущих консольные сортировалки, а не язык ДЛЛ оформить нормально - и то не получается /), написать рабочий код не могу, а исходников не для KOL у тебя нет - буду доканывать тебя теоретическими вопросами. Ты ловишь HCBT_CREATEWND? А что, ShowMessage окно не создает по-твоему? У тебя ж зависнет все на фиг, это единственное, чего ты добьешься... |
Unconnected |
14.09.2010 19:19
Сообщение
#17
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Цитата ДЛЛ оформить нормально - и то не получается Какое ценное лирическое отступление! Так значит, надо именно в dll хук оформлять? Просто я помню делал глобальный хук на клаву, там это было необязательно... -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 19:26
Сообщение
#18
|
Гость |
Хм... Надо было все-таки исходники попросить у тебя...
Цитата HCBT_CREATEWND DLL, конечно нужна...Windows вызывает хук WH_CBT с этим при создании окна. Когда хук установлен как локальный, это окно должно создаваться потоком, на который установлен хук. Хук WH_CBT вызывается до того, как Windows пошлет новому окну сообщения WM_GETMINMAXINFO, WM_NCCREATE, или WM_CREATE. Таким образом, фильтрующая функция может запретить создание окна, вернув TRUE. |
Unconnected |
14.09.2010 20:10
Сообщение
#19
|
mea culpa Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: 24 |
Ту би контин, блин.. Короче, такая dll:
library project1; Подключаю пока самым простым образом: function hoks(Code: integer; WParam: word; LParam: Integer): Longint; stdcall; external 'project1.dll' name 'CBTProc'; Так надо?.. -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
14.09.2010 21:24
Сообщение
#20
|
Гость |
Заставил ты меня все-таки написать работающий хук на FPC ...
Вот DLL-ка: {$mode delphi} Вот так вызывается (это чистый WinAPI)
Любые приложения запускаются, кроме Notepad-а... |
Текстовая версия | 20.04.2024 11:31 |