Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Загвоздка при использовании WH_KEYHOOK и передачи параметров в главное приложение. 


Эйнхерий   (2002-02-26 10:51) [0]

Здравствуйте, госпада программисты. Поясните мне следующую вещь: есть у меня программа, в которой я регестрирую своё событие. Из этой программы (вернее из dll, которую использует моя программа) ставлю глобальный хук типа WH_KEYBOARD, затем, когда в каком-либо приложении происходит нажатие клавиши, моя dll, загрузившаяся в адресное постранство этого приложения тоже регестрирует то же сообщение, что и главная программа и посылает главной программе это сообщение, где в wParam передаётся скан код нажатой клавиши, а вот в lParam хотелось бы передать handle главного окна того приложения, в котором произошло нажатие.
Я понимаю, что для получения дескриптора окна лучше использовать хук ShellProc, но ведь как-то можно это реализовать и из KEYHOOK...
Я пробовал Application.MainForm.Handle - естественно это не сработало, потому как по моему разумению сторонние процессы ни о каком TForm и VCL не знают.
Но почему тогда Application.ExeName выполняется корректно ? И Application.Handle тоже ?
Application - это, что объект ядра Windows инкапсулированный Borland-ом в TApplication ?
И идентичен ли Application.Handle дескриптору процесса ? (и чем отличается дескриптор процесса от hInstance ?).

Прошу прощения за столь тривиальные для Вас вопросы, но я не программист по профессии, а работу делать надо - вот все празники промучился, а handle окна, загрузившего мою dll, так и не смог получить :(
Всем ответившим - спасибо.



Виктор Щербаков   (2002-02-26 11:02) [1]

Слишком много вопросов. Их надо задать в разных ветках.

> а вот в lParam хотелось бы передать handle главного окна
> того приложения, в котором произошло нажатие.


Попробуй GetForegroundWindow.

> И идентичен ли Application.Handle дескриптору процесса ?

Нет. Application.Handle - хэндл главной формы.



Эйнхерий   (2002-02-26 11:12) [2]

>> Виктор Щербаков: Нет. Application.Handle - хэндл главной формы.
Не буду спорить, но если я ничего не напутал, то когда я пробовал в своей программе выводить:

Application.Handle;
и
Form1.Handle;

Я получал разные результаты. Хотя я могу ошибаться.

За совет спасибо большое - попробую обязательно.

Прошу процения, если горожу чушь,- ещё раз подчёркиваю, что я не спец и прошу делать на это скидку :)



Виктор Щербаков   (2002-02-26 11:18) [3]

Всё правильно.
Это я неточно выразился. Имеется ввиду хэндл главного окна приложения, а не главной формы. Т.е. окно, имя класса которого - TApplication. Это окно можно легко найти с помощью Winsigth.



Эйнхерий   (2002-02-26 15:24) [4]

Так что же с TApplication и Application, как объектом ядра Windows ?



Виктор Щербаков   (2002-02-26 15:55) [5]

Application - это не объект ядра Windows.
В классе TApplication собраны часто используемые в GUI- приложениях функции и определены события для многих сообщений.

Если очень интересно, то посмотри исходник VCL.



Эйнхерий   (2002-02-26 16:04) [6]

Тогда почему же Application.ExeName работает корректно, а Application.MainForm.Handle вызывает ошибку ?
Казалось бы один и тот же TApplication или я что-то путаю ?

Не сказать, что мне уж очень интересно, но выбора нет, буду смотреть - работа стоит уже 4-ый день.
(SDK и MSDN мне уже снятся - жена говорит я во сне что-то непонятное на ненашенском языке говорю :)



Виктор Щербаков   (2002-02-26 16:13) [7]

Мой тебе совет:
Пишешь хук - забудь про VCL и делай всё на API.
Естественно процессы к которым подключен хук, ничего не знают о VCL и использовать Application нет смысла. А ExeName корректно работает потому, что в реализации метода чтения этого свойства просто стоит вызов функции ParamStr(0), которую ты можешь вызвать напрямую.



Эйнхерий   (2002-02-26 16:16) [8]

Спасибо за совет, но дело-то в том, что я итак всё на API делать старался, к VCL я не от хорошей жизни прибегаю.

За разъяснения по поводу Application.ExeName спасибо.

Сегодня всё попробую.

Всего наилучшего.



Digitman   (2002-02-26 17:16) [9]

Имея хэндл некоего окна ты всегда можешь в цикле по ссылке на хэндл его род.окна (если окно - дочернее) выйти на корневое окно, которое, в 1-м приближении, можно интерпретировать как гл.окно целевого GUI-приложения.
см. GetParent()




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.029 c
3-94316           fishka                2002-04-09 10:26  2002.04.29  
Перевод базы с InterBase5.0 на InterBase 6.0


3-94296           Softmaster            2002-04-08 12:27  2002.04.29  
Восстановление базы Interbase


1-94447           Kordel                2002-04-16 01:52  2002.04.29  
Все еще про цвет в таблицах.


3-94279           yozhik                2002-04-08 13:29  2002.04.29  
Проблема с ADO


1-94510           petyun                2002-04-15 14:12  2002.04.29  
HexToBin