Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.29;
Скачать: CL | DM;

Вниз

Загвоздка при использовании 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()



Страницы: 1 вся ветка

Текущий архив: 2002.04.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
1-94452
Михаил
2002-04-15 12:07
2002.04.29
Создание компонента во время работы программы


3-94288
Sewix
2002-04-04 19:37
2002.04.29
DBGrid +Query = только чтение???


3-94268
dialectic
2002-04-05 09:22
2002.04.29
3 диалект и BDE


14-94565
Capo
2002-03-24 18:57
2002.04.29
mail via SMTP


7-94578
Nikolay
2002-02-01 18:28
2002.04.29
Сообщения