![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Форумчанин
Регистрация: 14.03.2011
Сообщений: 104
|
![]()
Проверил в C++Builder® XE. функции, у которых имеется директива _fastcall, передают параметры по одноименному соглашению, используемому в делфи. Без этой директивы, т е. по умолчанию, параметры передаются по соглашению stdcall.
Последний раз редактировалось Silver_S; 17.06.2011 в 00:29. |
![]() |
![]() |
![]() |
#12 | |
Участник клуба
Регистрация: 28.07.2009
Сообщений: 1,510
|
![]()
Silver_S
Массив я планировал заменить списком. Тут он не нужен. А вот то, что функция называлась CallWindowProc, это забавно :D Сменил - ошибка та же. Только теперь в функцию один раз входит и вылетает (раньше и правда рекурсия была) Вот хук (максимально урезал его) и лог из формы Код:
Цитата:
|
|
![]() |
![]() |
![]() |
#13 |
Форумчанин
Регистрация: 14.03.2011
Сообщений: 104
|
![]()
У каждого окна, возможно, изначально была своя уникальная процедура окна, так как визуальные библиотеки (VCL etc) активно используют SetWindowLongPtr. Вы же отдаете все параметры в процедуру, сохраненную в pnt. Думаю, массив нужен. Чтоб для каждого окна вы могли вызвать его оригинальную процедуру.
Должно быть примерно так: Код:
Если все заработает, то ваш лог сообщений может просто "захлебнуться", так как окну шлются десятки - тысячи сообщений ежесекундно. Лучше сделать просто счетчик. Последний раз редактировалось Silver_S; 17.06.2011 в 00:40. |
![]() |
![]() |
![]() |
#14 |
Участник клуба
Регистрация: 28.07.2009
Сообщений: 1,510
|
![]()
Зачем масив - мне бы хотя бы с одним окном разобраться? Активейт происходит только при одном клике на блокнот. Там же меняется его обработчик. Потом блокнот заходит в обработчик - поэтому 2036958 два раза - проверял.
Знаю, что должен захлебнуться. Но блокнот просто падает. Даже если убрать SendMessage из обработчика |
![]() |
![]() |
![]() |
#15 |
Форумчанин
Регистрация: 14.03.2011
Сообщений: 104
|
![]()
Каждый элемент окна - поля ввода, кнопки - с точки зрения работы Windows тоже окна, имеющие handle и свой WndProc. Ставя хук на процесс, вы ставите хук на все его окна, а не только на основное и всем им меняете WndProc.
|
![]() |
![]() |
![]() |
#16 |
Участник клуба
Регистрация: 28.07.2009
Сообщений: 1,510
|
![]()
Спасибо и на этом...
Не совсем понял почему на все эл-ты. Ведь я же на главное окно ставлю. +Если убрать замену и посмотреть, что за сообщения будут приходить из Activate, то там будет только одно сообщение при однократном клике на блокнот. Как сделать с массивом? UPD: Написал я через массив. Проблема в том, что в wnd у моего обработчика совсем не тот хендл, который нужен. Как из обработчика получить хендл? UPD2: Сегодня переписал заново, сначала потестив на собственном окне, заработало))) Наверно забыл stdcall когда в десятый раз копировал функцию из msdn и изменял её с C на делфи=) Последний раз редактировалось TwiX; 17.06.2011 в 13:49. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
H2269 Overriding virtual method 'TForm1.WndProc' has lower visibility (private) than base class 'TForm' | AlexanderSatorin | Общие вопросы Delphi | 2 | 27.06.2010 10:08 |
Слетает ОС | Медсестра | Операционные системы общие вопросы | 13 | 16.05.2010 01:51 |
Слетает верстка... | lastalert | HTML и CSS | 6 | 02.05.2010 17:14 |
Смена WndProc в рантайме | VVVadim | Win Api | 1 | 28.04.2009 18:16 |