Хук...

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

Хук...

Сообщение Джеффи » 09.05.2005 (Пн) 19:47

Я написал код, который с помощью хука позволяет ловить нажатия с клавиатуры и собирать в слова, причём с полной точностью также как в текстбоксе, а именно обработана задержка и скорость повтора...

А проблема вот в чём, хук должен ловить нажатия во всем Windows, а у меня это получается только в окне... Что делать??? :shock:

Код:
Код: Выделить всё
Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim u As Long, t As Long
    Dim check As String
    'On Error Resume Next
    '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
        If GetAsyncKeyState(wParam) = 0 Then IsPressed = False: KeyPressed = 0 Else IsPressed = True: KeyPressed = wParam
        If Not GetKL.Language = "Русская раскладка" Then FrmMain.SetSvet 2: GoTo TheEnd
        If GetKL.Language = "Русская раскладка" And FrmMain.Svet = 2 Then FrmMain.SetSvet 0
        If FrmMain.lblmain.Caption = "Запись словаря..." Or FrmMain.lblmain.Caption = "Открытие словаря..." Or Left(FrmMain.lblmain.Caption, 11) = "Загрузка..." Then GoTo TheEnd
        If KeyPressed = LastKey Then
            If IsPressed Then
                    Do
                        q = q + KeyDelay / 10
                        Sleep KeyDelay / 10
                        DoEvents
                        If KeyDelay <= q Then Exit Do
                    Loop Until GetAsyncKeyState(wParam) = 0
                    If GetAsyncKeyState(wParam) = 0 Then GoTo TheEnd
                    Do
                        Sleep KeySpeed
                        virGetKey = GetLit(wParam)
                        If virGetKey = "8" Then
                            If Not sStr = "" Then sStr = Left(sStr, Len(sStr) - 1)
                            FrmMain.lblmain.Caption = sStr
                        ElseIf Not virGetKey = " " Then
                            If FrmMain.Svet = 1 And Not sStr = "" Then
                                sStr = ""
                            End If
                            sStr = sStr & virGetKey
                            If Not sStr = "" Then FrmMain.lblmain.Caption = sStr: FrmMain.SetSvet 0
                        End If
                        DoEvents
                    Loop Until GetAsyncKeyState(wParam) = 0
                End If
             virGetKey = ""
        End If
        'On Error Resume Next
        If KeyPressed = LastKey Then GoTo TheEnd
            virGetKey = GetKey(KeyPressed)
            If virGetKey = "8" Then
                If Not sStr = "" Then sStr = Left(sStr, Len(sStr) - 1)
                FrmMain.lblmain.Caption = sStr
            ElseIf Not virGetKey = "" And Not virGetKey = "2" Then
                If FrmMain.Svet = 1 And Not sStr = "" Then
                    sStr = ""
                End If
                sStr = sStr & virGetKey
                'lastLit = Right(sStr, 1)
                'If Not virGetKey = Right(sStr, 1) Then FrmMain.lblmain.Caption = "ошибка"
                If Not sStr = "" Then FrmMain.lblmain.Caption = sStr: FrmMain.SetSvet 0
            ElseIf virGetKey = "2" Then
                If Not sStr = "" Then
                    check = DicCompare(sStr)
                    If check = "ошибок нет" Or sStr = "-" Then
                        sStr = ""
                        FrmMain.SetSvet 3
                        FrmMain.lblmain.Caption = sStr
                        AllWords = AllWords + 1
                        Status.stRefresh
                    Else
                        u = 0
                        For t = 0 To Status.LstErr.ListCount Step 1
                            If Status.LstErr.List(t) = sStr Then u = 1
                        Next t
                        If u = 0 Then
                            Status.LstErr.AddItem sStr
                            AllWords = AllWords + 1
                            ErrWords = ErrWords + 1
                            Status.stRefresh
                            If check = "Ошибка" Then FrmMain.ShowToolTip check & " в слове: " & FrmMain.lblmain.Caption Else FrmMain.ShowToolTip check
                            sndPlaySound App.Path & "\error.wav", SND_ASYNC
                            FrmMain.SetSvet 1
                        Else
                            FrmMain.SetSvet 1
                        End If
                    End If
                End If
            End If
TheEnd:
        IsPressed = False: LastKey = KeyPressed: KeyPressed = 0
        KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
    End If
End Function


Помогите пожалуйста...

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 09.05.2005 (Пн) 21:18

Этот хук локальный....
А для того чтоб и в других окнах ловить нажатия, нада ставить глобальный...
Для этого просто функцию KeyboardProc размести в dll, и придумай какой-нибудь способ общения твоей длл с твоей прогой.
А здесь могла бы быть ваша реклама...)

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 09.05.2005 (Пн) 22:36

Опришник писал(а):Этот хук локальный....
А для того чтоб и в других окнах ловить нажатия, нада ставить глобальный...
Для этого просто функцию KeyboardProc размести в dll, и придумай какой-нибудь способ общения твоей длл с твоей прогой.


Если ты такой умный дай пример или dll...

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 09.05.2005 (Пн) 22:37

FleX_2004 писал(а):2Джеффи попробуй найти похожие исходнички... и сравнить:) сложно ж сидеть на нетрезвую голову в чужом коде разбираться....


Хочешь быть хорошим программистом не бей, а то мозги отрафируются и страна раньше потеряет ещё одного спекиалиста :lol: :P

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 09.05.2005 (Пн) 22:44

2 Джеффи

А решение просто. Посмотреть как я в своем проекте ABC ловил нажатия...

Заодно и напишиешь че-нить хорошее про него...

ЗЫ. http://bbs.vbstreets.ru/viewtopic.php?p=119210
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 09.05.2005 (Пн) 22:45

"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 09.05.2005 (Пн) 23:13

Джеффи писал(а):
Опришник писал(а):Этот хук локальный....
А для того чтоб и в других окнах ловить нажатия, нада ставить глобальный...
Для этого просто функцию KeyboardProc размести в dll, и придумай какой-нибудь способ общения твоей длл с твоей прогой.


Если ты такой умный дай пример или dll...

ага, за 20$!!! (в грубом немного тоне ты разговариваешь!!!)
остальные могут скачивать бесплатно!!!
Вложения
keydll3.rar
_installhook@4(ByVal hWnd&) - устанавливает глобальный хук...,hWnd-манипулятор окна, которое будет принмать WM_KEYDOWN
_removehook@0()- снимает глобальный хук...
(9.28 Кб) Скачиваний: 41
А здесь могла бы быть ваша реклама...)

Джеффи
Бывалый
Бывалый
 
Сообщения: 256
Зарегистрирован: 06.03.2005 (Вс) 0:26

Сообщение Джеффи » 10.05.2005 (Вт) 2:21

Опришник писал(а):
Джеффи писал(а):
Опришник писал(а):Этот хук локальный....
А для того чтоб и в других окнах ловить нажатия, нада ставить глобальный...
Для этого просто функцию KeyboardProc размести в dll, и придумай какой-нибудь способ общения твоей длл с твоей прогой.


Если ты такой умный дай пример или dll...

ага, за 20$!!! (в грубом немного тоне ты разговариваешь!!!)
остальные могут скачивать бесплатно!!!


Прости за грубость но напишика пример использования...

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 15.05.2005 (Вс) 1:18

Пример использования:
Вложения
key_hook.rar
пример отлавливает нажатия, и запихивает в файл key.txt в текущем каталоге...
(10.81 Кб) Скачиваний: 47
А здесь могла бы быть ваша реклама...)

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 15.05.2005 (Вс) 1:35

Опришник писал(а):Пример использования:

Я так и не понял зачем таскать DLL?
На этом сайте есть статья: “как написать клавиатурный шпион”
Удачи!
С уважением, Алексадр.

Опришник
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 09.01.2005 (Вс) 0:48
Откуда: localhost

Сообщение Опришник » 15.05.2005 (Вс) 2:55

ДЛЛ таскать затем, что первая длл, и 2-ая - это разные длл!!!
А здесь могла бы быть ваша реклама...)


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 176

    TopList