我们知道,要使程序在用户按下鼠标或键盘时作出响应,可以用以下的两个事件:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) '鼠标按下
……
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '键盘按下
……
End Sub
    但是,这两个事件只对调用他的程序作出响应,而不能对其他程序中的鼠标或键盘的键按下作出响应。例如,myform是我们自己编制的软件,在myform中调用了这两个事件,当myform为当前运行的程序,用户在myform中按下了鼠标或键盘时,myform响应这两个事件,这是勿用置疑的;但是,如果myform不是当前运行的程序,当前运行的应用程序是word或excel等其公司制作的软件,用户在word或excel中按下了鼠标或键盘时,myform中的那两个事件便不会作出响应了。现在我的问题是:如何捕获在其他程序中的鼠标按下与键盘按下事件呢?换句说,就是怎样实现在当用户在WORD或EXCEL等其他程序中按下鼠标或键盘时,我们自己的软件myform也能作出响应呢?(可以用API函数解决吗?)

解决方案 »

  1.   

    不是写木马。写一个管理软件。我是一位教师,想写一个软保护电脑教室里的电脑,同时禁止学生上不健康的网站,禁止学生在上课时玩游戏。大力水手,hook mouse and key这是什么意思?
      

  2.   

    如果你要监测键盘,鼠标的输入来检测学生的活动是根本就行不同的.因为,一.你不能知道他输入的是什么汉字,二,你不知道鼠标点的是什么.这跟本就没什么用处.
       建议:
            做一个client--sever,其中,①可以查看的结束掉client的所有的进程或者是限制其进程的运行.②可以截取client的屏幕.  有了这两个大概就可以了哦.呵呵~~~
                        无论晴天也好,雨天也好,我希望和你一起度过~~~~~~~~风笛~~~~~~~
      

  3.   

    Accelerator, 请具体说一说怎样“dll和Hook”法?
      

  4.   

    “建议:
            做一个client--sever,其中,①可以查看的结束掉client的所有的进程或者是限制其进程的运行.②可以截取client的屏幕.  有了这两个大概就可以了哦.呵呵~~~”
    ——————————————————————————————————————
    zixing,你的建议很好,我现在就是做成“客户机——服务器”模式的。你提到“②可以截取client的屏幕”,怎样实现这个功能呢?
      

  5.   

    vb不能用作处理系统级的hook,除非用c写dll.你倒不如这样:
        每个station都运行你写的client,然后定时把系统中正在运行的程序列表发给你的server,你在server端监视.
        有必要象你所说的去控制他们的行为吗?
        关于上网的问题,我想还是叫proxy server去处理吧,那样会好的多.
      

  6.   

    最好用VC做全局钩子!
    如果硬要用VB的话:'新建一个窗口,把下面内容粘进去
    Private Sub Form_Load()
    hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, App.hInstance, 0)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    UnhookWindowsHookEx hHook
    End Sub
    '----------------------------'新建一个模块,把下面内容粘进去
    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
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const WH_KEYBOARD = 2
    Public Const WH_MOUSE = 7
    Public Const WH_JOURNALRECORD = 0Public Type EVENTMSG
            message As Long
            paramL As Long
            paramH As Long
            time As Long
            hwnd As Long
    End Type
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public hHook As Long
    Public msg As EVENTMSGPublic Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    CopyMemory msg, lParam, Len(msg)
    Debug.Print msg.hwnd, msg.message, msg.paramH, msg.paramL, msg.time
    HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
    End Function
      

  7.   

    不行呀,这个勾子只对调用它的程序作出响应,而对其他程序没有响应。怎样做全局勾子,用VB可以做全局勾子吗(VB也可以做DLL呀)?如不做全局勾子,还有什么办法可以解决这个问题吗?
      

  8.   

    vb做出来的dll是activex dll,不是标准的动态连接库,vb的钩子没有能力进入到别的线程中间去
      

  9.   

    子类不行通,除非你自己的消息处理函数(WndProc)是运行在其它程序的进程空间里
    用VC写DLL做全局钩子,不过挺麻烦的