Страница: 1 |
Страница: 1 |
Вопрос: SetWindowsHookEx
Добавлено: 07.02.06 16:33
Автор вопроса: silently_fox | ICQ: 257821932
При глобальном хуке(установленном в dll) для каждого приложения создаеться отдельный
эксемпляр dll в ее адресном пространстве и для каждой из них будут свои глобальные
переменные, как я понял на Си глобальные переменные с помощью диретив компилятора(pragma)
помещаются в именованный сегмент данных.
На PB такой директивы нет, как же тогда поступить
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 07.02.06 18:32
и для каждой из них будут свои глобальные переменные
С точностью до наоборот. Секция данных общая на все процессы, в которые подгружена dll. Именно поэтому и возможен хук.
Такая структура достигается определенными ключами линкера. В пб насколько я знаю, ключи оговаривать не получится.
как же тогда поступить
Использовать непб
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 07.02.06 20:16
На сколько я знаю SHARED секцию на нем не организовать, но что нам мепшает создать объект FileMapping и разделять его между разными процессами... Лишь бы имя было уникальным
Номер ответа: 3
Автор ответа:
silently_fox
ICQ: 257821932
Вопросов: 5
Ответов: 9
Профиль | | #3
Добавлено: 07.02.06 21:16
Можно подробнее
Номер ответа: 4
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #4
Добавлено: 11.02.06 17:53
Пример глобального хука на PBWIN c использованием SetWindowsHookEx
Тестовый EXE файл:
#Dim All
#Register None
#Include "Win32Api.Inc"
$UniqueName = "My Hook"
Declare Function SetHook Lib "HookD.Dll" Alias "SetHook" (hWnd As Long) As Long
CallBack Function DlgProc
Local hHook As Long
Static Id As Long
Select Case CbMsg
Case %WM_INITDIALOG: SetHook CbHndl
Case %WM_USER + 1
Incr Id
SetWindowText GetDlgItem(CbHndl, 101), "KbdHook # " + Str$(id) + _
" wParam = " + Hex$(CbWparam) + " LParam = " + Hex$(CbLparam) + " at " + Time$
Case %WM_DESTROY : hHook = GetProp(CbHndl, ByVal 1): If hHook Then UnhookWindowsHookEx hHook
End Select
End Function
Function PbMain
Local hDlg As Long
 ialog New 0, $UniqueName, , , 300, 40, %WS_CAPTION Or %DS_MODALFRAME Or %WS_SYSMENU, %WS_EX_TOPMOST To hDlg
Control Add Label, hDlg, 101, "", 10, 10, 280, 12
 ialog Show Modal hDlg Call DlgProc
End Function
Hook.dll
#Register None
#Dim All
#Include "Win32Api.Inc"
$UniqueName = "My Hook"
Global hInstDLL As Long, MainDll As Long
Function LibMain(ByVal hInstance As Long, ByVal fwdReason As Long, _
ByVal lpvReserved As Long) Export As Long
Select Case fwdReason
Case %DLL_PROCESS_ATTACH: hInstDLL = hInstance: LibMain = 1
Case %DLL_PROCESS_DETACH: LibMain = 1
End Select
End Function
Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) Export As Long
Static hHook As Long, hDlg As Long
hDlg = FindWindow("", $UniqueName)
If hHook = 0 Then If hDlg Then hHook = GetProp(hDlg, ByVal 1)
If hHook Then Function = CallNextHookEx(ByVal hHook, ByVal nCode, ByVal wParam, ByVal lParam)
If IsFalse(MainDll) And (IsFalse(hDlg) Or IsFalse(hHook)) Then FreeLibrary hInstDll Else _
PostMessage hDlg, %WM_USER + 1, wParam, lParam
End Function
Function SetHook Alias "SetHook" (hWnd As Long) Export As Long
Local hHook As Long
hHook = SetWindowsHookEx (%WH_KEYBOARD, CodePtr(HookProc), ByVal hInstDLL, ByVal 0)
SetProp hWnd, ByVal 1, ByVal hHook
MainDll = 1
End Function
Номер ответа: 5
Автор ответа:
silently_fox
ICQ: 257821932
Вопросов: 5
Ответов: 9
Профиль | | #5
Добавлено: 11.02.06 22:06
Спасибо