请教各位高手为什么我在VB6.0中想使用钩子函数会出现问题

时间:2021-11-16 11:46:37
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, wParam As Long, lParam As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Public 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

这三行总报错!
谢谢好心人给我个具体的回答!

9 个解决方案

#1


你要把以public方式声明的api函数放到标准模块中

#2


可不可以举个详细例子吗?我不是很明白,拜托!

#3


把你完整代码贴上来,hook这东西,有一点错误都可能会崩溃。

#4


Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, wParam As Long, lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public 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
Const WH_KEYBOARD As Integer = 2
Const KEY_WINSTART = 91
Const KEY_WINMENU = 93
Public hHook As Long
Option Explicit
Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOfKeyboardProc, 0, App.ThreadID)
    Me.Show
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ret = SetWindowText(Form1.hwnd, "new name")
End Sub

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    KetboardProc = 0
'    If nCode >= 0 Then
        If wParam = vbKeySnapshot Then
'            If (lParam And &HC0000000) = 0 Then
'                MsgBox "", , ""
                KeyboardProc = 1
'                Exit Function
'            End If
        End If
'    End If
'    Call CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

Private Sub Form_Unload(Cancel As Integer)
    Call UnhookWindowsHookEx(hHook)
End Sub

#5


声明的时候就出错了

#6


把下面过程和相关声明放在标准模块中

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    KetboardProc = 0
'    If nCode >= 0 Then
        If wParam = vbKeySnapshot Then
'            If (lParam And &HC0000000) = 0 Then
'                MsgBox "", , ""
                KeyboardProc = 1
'                Exit Function
'            End If
        End If
'    End If
'    Call CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

#7


我本来就把以上代码都放在了标准模块中的呀

#8


你把窗体和模块的代码分别贴出来


Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOfKeyboardProc, 0, App.ThreadID)
    Me.Show
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ret = SetWindowText(Form1.hwnd, "new name")
End Sub
这些要放在窗体中

#9


Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
改成以public方式声明,也放在模块中

#1


你要把以public方式声明的api函数放到标准模块中

#2


可不可以举个详细例子吗?我不是很明白,拜托!

#3


把你完整代码贴上来,hook这东西,有一点错误都可能会崩溃。

#4


Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, wParam As Long, lParam As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public 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
Const WH_KEYBOARD As Integer = 2
Const KEY_WINSTART = 91
Const KEY_WINMENU = 93
Public hHook As Long
Option Explicit
Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOfKeyboardProc, 0, App.ThreadID)
    Me.Show
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ret = SetWindowText(Form1.hwnd, "new name")
End Sub

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    KetboardProc = 0
'    If nCode >= 0 Then
        If wParam = vbKeySnapshot Then
'            If (lParam And &HC0000000) = 0 Then
'                MsgBox "", , ""
                KeyboardProc = 1
'                Exit Function
'            End If
        End If
'    End If
'    Call CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

Private Sub Form_Unload(Cancel As Integer)
    Call UnhookWindowsHookEx(hHook)
End Sub

#5


声明的时候就出错了

#6


把下面过程和相关声明放在标准模块中

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    KetboardProc = 0
'    If nCode >= 0 Then
        If wParam = vbKeySnapshot Then
'            If (lParam And &HC0000000) = 0 Then
'                MsgBox "", , ""
                KeyboardProc = 1
'                Exit Function
'            End If
        End If
'    End If
'    Call CallNextHookEx(hHook, nCode, wParam, lParam)
End Function

#7


我本来就把以上代码都放在了标准模块中的呀

#8


你把窗体和模块的代码分别贴出来


Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOfKeyboardProc, 0, App.ThreadID)
    Me.Show
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ret = SetWindowText(Form1.hwnd, "new name")
End Sub
这些要放在窗体中

#9


Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
改成以public方式声明,也放在模块中