Помогите с Windows Hooks

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
unICS
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 21.06.2008 (Сб) 8:14

Помогите с Windows Hooks

Сообщение unICS » 27.09.2009 (Вс) 10:22

Hi All! Вот иXэмпл из API-Guide:
Код: Выделить всё
'In a module
Public Const WH_KEYBOARD = 2
Public Const VK_SHIFT = &H10
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public hHook As Long
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'if idHook is less than zero, no further processing is required
    If idHook < 0 Then
        'call the next hook
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    Else
        'check if SHIFT-S is pressed
        If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
            'show the result
            Form1.Print "Shift-S pressed ..."
        End If
        'call the next hook
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    End If
End Function

'In a form, called Form1
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'set a keyboard hook
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'remove the windows-hook
    UnhookWindowsHookEx hHook
End Sub

Работает только когда окно активно. Как сделать, что б ловились события из других окон? Т.е. я так понимаю, хук локальный, как сделать его глобальным неясно. В SetWindowsHookEx пробовал менять последний параметр на vbNull, но это видимо не то.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите с Windows Hooks

Сообщение iGrok » 27.09.2009 (Вс) 11:50

Эта.. Глобальный хук делается так:

Справа вверху есть поле для ввода с текстом "Поиск..." и такой лупой.
Туда нужно ввести слова "глобальный хук", и нажать кнопку "Поиск" справа от поля.

Там сразу столько информации появляется...
label:
cli
jmp label

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Помогите с Windows Hooks

Сообщение awl100Alex » 27.09.2009 (Вс) 22:43

Для глобального хука нужно откомпилировать этот код в Dll и вызывать от туда...

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Помогите с Windows Hooks

Сообщение arvitaly » 27.09.2009 (Вс) 23:41

Не обязательно viewtopic.php?f=28&t=38371

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Помогите с Windows Hooks

Сообщение awl100Alex » 28.09.2009 (Пн) 2:11

arvitaly писал(а):Не обязательно viewtopic.php?f=28&t=38371

Ну так и какая разница??? В этом примере тоже используется отдельный модуль ocx так же как и Dll с параметром dwTreadId равным нулю (глобальный значит). Разницы нет.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Помогите с Windows Hooks

Сообщение awl100Alex » 29.09.2009 (Вт) 18:28

unICS
Кстати, если тебе нужно глобально перехватывать консоль, чтобы не связываться с Dll и прочими отдельными модулями, вместо WH_KEYBOARD используй лучше WH_KEYBOARD_LL (низкоуровневый хук клавиатуры). Это будет примерно тоже самое и все в одном VB.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот и гости: 97

    TopList