Форум: "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.006 c