一段关于钩子和消息的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

解决方案 »

  1.   

    要在其它进程中设置钩子,winproc必须位于动态链接库中。VB中不能编译这样的动态链接库。
      

  2.   

    用WH_KEYBOARD_LL  WH_KEYBOARD_LL是全局的另外,看楼主的代码貌似是把cmd中的东西弄到textbox里面来? 那是不是考虑一下pipe?
      

  3.   

    顶.直接使用管道吧,重定向到自己的管道:http://topic.csdn.net/u/20080314/21/5aa66dea-2a8a-45a1-bd38-d305bbb1b8fa.html
      

  4.   

    二楼的能说下pipe是什么玩意么?
      

  5.   

    pipe就是管道,参考老马在3L的帖子中的那个链接指向的帖子的5L及后续。