-
Здравствуйте.
Есть программа, которая использует dll, которая в свою очередь перехватывает открытие и закрытие окон и пишет все это дело в текстовый файл. но нужно чтобы передавала значения в саму программу использующую эту библиотеку.
Как это сделать? Все перерыл, ничего не нашел.
Заранее благодарен.
-
> которая в свою очередь перехватывает открытие и закрытие
> окон
Глоб.хук что ли ?
-
> передавала значения в саму программу использующую эту библиотеку.
какие вообще проблемы ? Библиотека твоя? Ну напиши функцию экспортируемую , назови ее как нить GetValue, пусть она возвращает значение при вызове из твоего приложения. Можешь также в процедуру инициализации твоей библиотеки передать Handle главного окна программы, и при необходимости посылать пользовательское оконное сообщение из библиотеки главному окну.
-
> denmin © (18.03.08 10:00)
> Как это сделать?
Зависит от ответов на такие вопросы:
1. Можете ли Вы эту DLL перекомпилировать?
2. DLL перехватывает открытие и закрытие окон через глобальный хук или как-то иначе?
-
библиотека моя. перекомпилировать могу. т.к. машины не очень мощный, то не хотелось бы использовать sendmessage. хук на WM_CBT. надо чтобы при срабатывании хука мое приложение получало сообщение но при этом загрузка системы была минимальна. слышал что-то типа внутреннего события, но не помню что такое. может ошибаюсь.
-
> может ошибаюсь
Ошибаешься.
-
> denmin © (18.03.08 14:48) [4]
Хук глобальный, поэтому механизм обратного вызова (callback) не прокатит. Используйте Send/PostMessage. Через систему проходит такая куча сообщений, что Ваши будут каплей в море.
-
Вот пример исходника библиотеки на VB:
Начало библиотеки (объявление общей функции)
Option Explicit
Public Event GetWin32Prc (lParam as Long) – общая функция
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
…
Обработка перехвата в библиотеке
CopyMemory EMSG, ByVal lParam, Len(EMSG)
Case HCBT_CREATEWND
RaiseEvent GetWin32Prc (EMSG.lParamLow)
Это начало приложения…
Dim WithEvents sh As cSystemHook
Private Sub sh_ GetWin32Prc (lParam as Long)
Msgbox “Результат: ” & CStr(lParam)
End Sub
-
> denmin © (18.03.08 15:31) [7]
К чему приведен этот VB-код ?
К твоей задаче он не имеет отношения.
-
в окне этого VB приложения я вижу все открываемые окна, процессы. в приложении, а не в текстовом файле. в этом примере передается значение от библиотеки приложению через функцию, Public Event GetWin32Prc (lParam as Long) – общую функцию. в библиотеке объявлена функция Public Event GetWin32Prc (lParam as Long) и этаже функция объявлена в приложении
Dim WithEvents sh As cSystemHook
Private Sub sh_ GetWin32Prc (lParam as Long)
и посредством этого у приложнения и библиотеки есть обратная связь. возможно ли в дельфи создать нечто подобное?
-
есть ли способ использовать WM_CBT без использование библиотек?
-
> denmin © (18.03.08 15:58) [9]
Ты не понимаешь механизм работы глобальных хуков.
Экз-ры хук-библиотеки находятся в изолированных адресных пространствах процессов, поэтому RaiseEvent тут идет лесом.
Читай [6]
-
Или у тебя локальный хук ?
Тогда, разумеется, RaiseEvent работает, и без dll можно обойтись, равно как и без Send/PostMessage