一段关于钩子和消息的VB代码:看看出了什么问题.........
在Texe1上面的操作能映射到命令提示符窗口,可是在命令提示符窗口上面的操作不能映射到回Texe1上面
想了很久了,还是找不到问题所在,下面是具体代码:标准模块"Module1"的代码:Public PID As Long, TID As Long, WID As Long
Public HookID As Long, WinLong As LongPrivate Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Function WndProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'把命令提示符窗口的按键消息传递给Form1.Text1
If lParam > 0 Then
CallWindowProc WinLong, Form1.Text1.hwnd, 256, wParam, lParam
CallWindowProc WinLong, Form1.Text1.hwnd, 258, wParam, lParam
Else
CallWindowProc WinLong, Form1.Text1.hwnd, 257, wParam, lParam
End If
'把消息交还给系统
CallNextHookEx HookID, nCode, wParam, lParam
End FunctionPublic Function MeWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
If msg >= 256 And msg <= 258 Then SendNotifyMessage WID, msg, wp, lp '如果是按键消息就传递给命令提示符窗口
MeWndProc = CallWindowProc(WinLong, hwnd, msg, wp, lp) '把消息交给Form1.Text1默认的窗口函数去处理
End Function窗体"Form1"的代码:Private Const GWL_WNDPROC = -4Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Const WH_KEYBOARD = 2
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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Command1_Click()
Dim TomPID As Long
PID = Shell("cmd", vbNormalFocus) '启动命令提示符窗口(cmd.exe)并取得进程ID
Sleep 1000 '延时等待启动完毕'从这儿开始寻找哪个窗口是命令提示符窗口, 并取得它的线程和句柄(即:TID和WID)
WID = GetWindow(GetDesktopWindow, GW_CHILD)
Do
TID = GetWindowThreadProcessId(WID, TomPID)
If TomPID = PID Then '如果与窗口句柄(WID)关联的进程ID(TomPID)正好等于cmd.exe的进程ID, 那就表明这个窗口就是命令提示符窗口
HookID = SetWindowsHookEx(WH_KEYBOARD, AddressOf WndProc, 0, TID) '为该线程设置钩子——监听该线程的按键消息
WinLong = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf MeWndProc) '取得Text1的默认窗口函数并设置新的窗口函数,凭这两个就可以跟命令提示符窗口进行通信了
Command1.Enabled = False
Command2.Enabled = True
Exit Sub
End If
WID = GetWindow(WID, GW_HWNDNEXT)
Loop While WID > 0
End SubPrivate Sub Command2_Click()
'把这一切都还原
UnhookWindowsHookEx HookID
SetWindowLong Text1.hwnd, GWL_WNDPROC, WinLong
Command1.Enabled = True
Command2.Enabled = False
End Sub
在Texe1上面的操作能映射到命令提示符窗口,可是在命令提示符窗口上面的操作不能映射到回Texe1上面
想了很久了,还是找不到问题所在,下面是具体代码:标准模块"Module1"的代码:Public PID As Long, TID As Long, WID As Long
Public HookID As Long, WinLong As LongPrivate Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Function WndProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'把命令提示符窗口的按键消息传递给Form1.Text1
If lParam > 0 Then
CallWindowProc WinLong, Form1.Text1.hwnd, 256, wParam, lParam
CallWindowProc WinLong, Form1.Text1.hwnd, 258, wParam, lParam
Else
CallWindowProc WinLong, Form1.Text1.hwnd, 257, wParam, lParam
End If
'把消息交还给系统
CallNextHookEx HookID, nCode, wParam, lParam
End FunctionPublic Function MeWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
If msg >= 256 And msg <= 258 Then SendNotifyMessage WID, msg, wp, lp '如果是按键消息就传递给命令提示符窗口
MeWndProc = CallWindowProc(WinLong, hwnd, msg, wp, lp) '把消息交给Form1.Text1默认的窗口函数去处理
End Function窗体"Form1"的代码:Private Const GWL_WNDPROC = -4Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Const WH_KEYBOARD = 2
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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Command1_Click()
Dim TomPID As Long
PID = Shell("cmd", vbNormalFocus) '启动命令提示符窗口(cmd.exe)并取得进程ID
Sleep 1000 '延时等待启动完毕'从这儿开始寻找哪个窗口是命令提示符窗口, 并取得它的线程和句柄(即:TID和WID)
WID = GetWindow(GetDesktopWindow, GW_CHILD)
Do
TID = GetWindowThreadProcessId(WID, TomPID)
If TomPID = PID Then '如果与窗口句柄(WID)关联的进程ID(TomPID)正好等于cmd.exe的进程ID, 那就表明这个窗口就是命令提示符窗口
HookID = SetWindowsHookEx(WH_KEYBOARD, AddressOf WndProc, 0, TID) '为该线程设置钩子——监听该线程的按键消息
WinLong = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf MeWndProc) '取得Text1的默认窗口函数并设置新的窗口函数,凭这两个就可以跟命令提示符窗口进行通信了
Command1.Enabled = False
Command2.Enabled = True
Exit Sub
End If
WID = GetWindow(WID, GW_HWNDNEXT)
Loop While WID > 0
End SubPrivate Sub Command2_Click()
'把这一切都还原
UnhookWindowsHookEx HookID
SetWindowLong Text1.hwnd, GWL_WNDPROC, WinLong
Command1.Enabled = True
Command2.Enabled = False
End Sub
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货