Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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()



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

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

Наверх




Память: 0.47 MB
Время: 0.005 c
3-94307
только начал изучать дельфи
2002-03-23 16:27
2002.04.29
Добавление записи


1-94457
LazorenkoX
2002-04-16 09:16
2002.04.29
TStringGrid.PrintMe()


1-94399
Ezh
2002-04-06 12:11
2002.04.29
Из Экселя в СтрингГрид


6-94522
Termik
2002-02-15 10:10
2002.04.29
Получение IP-адреса через имя машины.


3-94317
AndreyP
2002-04-09 13:23
2002.04.29
Показ результата выборки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский