要想捕获所有的鼠标和键盘消息,必须写全局钩子,
全局钩子必须在动态库里,VB可以写动态库,所以可以做一个全局钩子,
但要想你的应用程序得到响应,必须在动态库里有一个静态存储区,
因为动态库是映射到每一个应用程序中的,如果存到普通存储区,那就只会有一个动态库里有你的程序的指针,其它的都为空,这时在别的应用程序是活动状态时,你设置的钩子虽然起做用,但你写的应用程序却得不到响应,而VB没有静态存储区,所以用VB没法到达你的效果,只好用VC了或其它的也可以。
不过也未必呀,因为VB有Active exe,还可以用内存文件之类,所以也不是没有可能,不过我还没试过。

解决方案 »

  1.   

    VB调用API函数使窗口保持在最上层 ,2让窗口拒绝接受键盘和鼠标事件   
    ---- 我们看到有的应用程序不管窗口是否活动都使窗口保持在最上层,常见的Microsoft Word的文件打开和编辑查找窗口就是这样。在VB开发中可以通过调用SetWindowsPos()API函数实现这个功能。该函数声明如下: Private Declare Function SetWindowPos
     Lib "user32" (ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long, ByVal
     x As Long, ByVal y As Long, _
       ByVal cx As Long, ByVal cy As Long, 
         ByVal wFlags As Long) As Long
    ---- hWnd变元是窗口的句柄;x,y是窗口的左上角的坐标;cx、cy是窗口宽度和高度;hWndInsertAfter变元是窗口清单中hWnd窗口前面的窗口句柄,有四个可选值: 序号 可 选 值 作 用
    1 HWND_BOTTOM 把窗口放在窗口清单的底部
    2 HWND_TOP 把窗口放在窗口清单的字符顺序的顶部
    3 HWND_TOPMOST 把窗口放在窗口清单的顶部
    4 HWND_NOTOPMOST 把窗口放在窗口清单的顶部,最上层窗口之下
    ---- WFlags变元为整型值,有八个可选值: 序号 可  选  值 作   用
    1 SWP_DRAWFRAME 在窗口周围画一个方框
    2 SWP_HIDEWINDOW 隐藏窗口
    3 SWP_NOACTIVATE  不激活窗口
    4 SWP_NOMOVE 保持窗口当前位置
    5 SWP_NOREDRAW 窗口不自动重画
    6 SWP_NOSIZE  保持窗口当前尺寸
    7 SWP_NOZORDER 保持窗口在窗口清单中的当前位置
    8 SWP_SHOWWINDOW 显示窗口
    ---- 下面的例子程序Test演示了对函数中的以上7个变元作正确的选择后,应用程序运行后窗口总可保持在最上层,程序清单如下: Option Explicit
    Private Declare Function SetWindowPos
    Lib "user32" (ByVal hwnd As Long, _
     ByVal hWndInsertAfter As Long,
     ByVal x As Long, ByVal y As Long, _
       ByVal cx As Long, ByVal cy As Long,
         ByVal wFlags As Long) As Long
    Private Const HWND_TOPMOST = -1
    Private Const SWP_SHOWWINDOWS = &H40Private Sub Form_Load()
    Dim retValue As Long
    retValue = SetWindowPos(Me.hwnd,
     HWND_TOPMOST, Me.CurrentX, _
     Me.CurrentY, 300, 300, SWP_SHOWWINDOWS)
    End Sub
    ---- 备注:编写函数声明时,整个函数声明须在一行中写完,不可提行。一般是自动从系统中得到函数声明,方法是从VB的外接程序管理中启动“API 浏览”程序,在“API 浏览”程序中找到所需的函数声明,然后复制到VB代码中。 让窗口拒绝接受键盘和鼠标事件   
           
    声明:
    Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    使用:
    '拒绝接受键盘和鼠标事件
    Call EnableWindow(Form.hwnd, 0)
    '允许接受键盘和鼠标事件
    Call EnableWindow(Form.hwnd, 1)
      

  2.   

    如何使键盘、Mouse失效(JournalPlayBack Hook)来源:cww我们常见一些导览系统或教学系统,会自动移动Mouse与Keyin字,而那个时候,我们
    不管Keyin或动Mouse都没有效,直到完成了导览系统的某个动作後才让使用者可以移
    动Mouse与做Keyin的动作;想做到这个,要借重JournalPlayBack Hook。JournalPlayBack Hook,它和JournalRecord Hook合称Journal Hook,它们作用
    的范围是整个System,也就是挂上这个Hook後,影响的层面不单是这个Process,而是
    所有的Process,而这两Hook又不用写在Dll之中,所以很好用。首先我们要知道由键盘和Mouse输入等的硬体讯息,会存到一个System Queue而後OS会
    到该System Queue看有没有讯息在其中,若有则撷取出来,看目前Active的Window是谁
    而将讯息Post给它。而挂上JournalRecord Hook时,当有讯息被撷取出来时,会先执行
    我们所设定的Hook Function(在vb中,一定要放在.BAS档之中)。这可以做什麽事呢?
    例如们可以Check整个系统是否有按了键盘或有没有移动Mouse(一般来说,KeyUp,KeyDown
    , MouseMove等Event只有Form在Active 时才收得到,挂上JournalRecord hook後,执行
    Hook的thread便能收到所有这些讯息)。再如,它既然能收到Keyboard、Mouse的讯息,那
    便可以将收到的讯息记录起来(记录於Memory或Disk都可以),之後再依方才的顺序重新
    将讯息放送出来,可重新执行方才的动作(这不就是巨集的作法吗),或许
    它叫JournalRecord便是这个原因。再来便是播放记录讯息的问题了,如果一面播放,一
    面有其他讯息插队(如移动Mouse),那就不对了,所以JournalPlayBack这个Hook它会
    让Mouse、Keyboard都失效,当OS 要求读System Queue时,便会启动这个Hook,就在此
    时,我们可以把方才记录起来的讯息丢出一个出来,OS再要求读System Queue时,再丢
    下一个讯息,如此达重播的效果(所以才叫JournalPlayBack),正因它会让键盘、Mouse
    失效,拿它来做导览、教学系统的自动Move Mouse或文字显示是最适合的了。Mouse的自动导引系统制作方式,可叁考如何自动移动Mouse'以下在.Bas中
    Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
    Const WM_MOUSELAST = &H209
    Const WM_MOUSEFIRST = &H200
    Public Const WM_KEYLAST = &H108
    Public Const WM_KEYFIRST = &H100
    Public Const WH_JOURNALRECORD = 0
    Public Const WH_JOURNALPLAYBACK = 1Type EVENTMSG
            message As Long
            paramL As Long
            paramH As Long
            time As Long
            hwnd As Long
    End Type
    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
    Declare Function UnhookWindowsHookEx Lib "user32" _
       (ByVal hHook As Long) As Long
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
       ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public hNxtHook As Long   ' handle of Hook Procedure
    Public msg As EVENTMSGSub EnableHook()
       hNxtHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf HookProc, App.hInstance, 0)
    End Sub
    Sub FreeHook()
        Dim ret As Long
        ret = UnhookWindowsHookEx(hNxtHook)
    End Sub
    Function HookProc(ByVal code As Long, ByVal wParam As Long, _
                    ByVal lParam As Long) As Long
    HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)
    End Function'以下在Form中,需求:一个Command1, 一个text1
    Private Sub Command1_Click()
    Dim str5 As String, len5 As Long, i As LongCall EnableHook
    str5 = "这是一个测试JournalPlayBackHook的程式"
    len5 = Len(str5)
    For i = 1 To len5
        Text1.Text = Mid(str5, 1, i)
        Text1.Refresh
        Sleep (200)
    Next
    Call FreeHook
    End Sub
      

  3.   

    1.运行这个程序时不管是别的程序还是这个程序都不能响应,这样做好像达不到所要求的吧。
    2.在win2k下有个问题,Ctrl+Alt+Del组合没有办法屏蔽.