考虑用vc截吧,不是很难的
给你2个例子http://www.csdn.net/expert/Topic/440/440349.shtm
或者
http://www.vckbase.com/vckbase/vckbase11/vc/nonctrls/system_30/1130008.htm

解决方案 »

  1.   


    如何使键盘、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
      

  2.   

    SendMessage能实现吗?怎么做?
      

  3.   

    如果你只是想禁止鼠标或键盘的操作可以用 EnableWindow 这个API函数
      

  4.   

    可乐都不能是我想要做的,我想用setwindowshookex这个涵数来控制其它程序的消息,其中有一个参数是要程序的实例的,如何取得呢
      

  5.   

    GetWindowLong(hWnd,GWL_HINSTANCE)得到的是应用程序实例的句柄,但前提是要有窗口句柄。
      

  6.   

    以下是用注册表保存窗口句柄,
    然后再操作的代码需要注册表类的支持。Option Explicit
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongConst SW_RESTORE = 9Const SW_SHOWNORMAL = 1Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_SYSCOMMAND = &H112
    Private Const SC_MOVE = &HF010&
    Private Const SC_RESTORE = &HF120&
    Private Const SC_SIZE = &HF000&Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long'用途:不让程序启动时加第二个实例
    '所需部件:RegAccess
    '调用:启动时调用InitInstance
    '      在主窗体加载时调用LogInstancePublic Sub InitInstance(ByVal sAppTitle As String)Dim mHwnd As Long
    Dim PrevWinCap As String * 255
    Dim winCap As String
    Dim lResult As Long, lRetVar As Long
    Dim Rm As New ClsReg
                
     mHwnd = Val(Rm.GetRegSetting(sAppTitle, "DataSet", "MainHwnd", 0))
          If mHwnd <> 0 Then
              lRetVar = GetWindowText(mHwnd, PrevWinCap, 254)
              If Left(PrevWinCap, Len(sAppTitle)) = sAppTitle Then
                 winCap = Left(PrevWinCap, InStr(1, PrevWinCap, Chr(0)))
              Else
                 winCap = ""
              End If          If winCap <> "" Then
                SendMessage mHwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
                lResult = ShowWindow(mHwnd, SW_SHOWNORMAL)
                SetForegroundWindow mHwnd
                End
              End If
          End If
          
          If App.PrevInstance Then
             End
          End If
          
    End SubPublic Sub LogInstance(ByVal sAppTitle As String, oForm As Form)
    Dim Rm As New ClsReg
      
            Rm.SaveRegSetting sAppTitle, "DataSet", "MainHwnd", CStr(oForm.hwnd)End Sub