比如当前窗口为ie浏览器窗口,我想让浏览器按下F5键后无效果(不刷新),而我当前程序还能知道f5键被按下了,谁能告诉我方法?

解决方案 »

  1.   

    去hook浏览器吗?能具体点吗?
      

  2.   

    Windows的钩子函数分两种,一种是全局的,一种是线程的。全局的钩子函数可以捕获任何应用程序的消息,但必须是标准的DLL才能实现,VB做不了。VB可以实现线程的,就是当前应用程序的消息,这对鼠标消息的捕捉有影响。 
        SetWindowsHookEx定义如下: 
        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 
        idHook是钩子类型,如WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。hmod用于全局钩子,VB要实现钩子,必须设为0。dwThreadId用于线程钩子VB中可以设置为App.ThreadID。lpfn为钩子函数,在VB中可以使用AddressOf获得钩子函数的地址。这个函数因为钩子类型不同而有所不同。如键盘钩子为: 
        Public Function KeyboardProc(ByVal nCode As Long, _ 
         ByVal wParam As Long, _ 
         ByVal lParam As Long) As Long 
        如果Code不为0,钩子函数必须调用CallNextHookEx,将消息传递给下面的钩子。wParam和lParam不是按键。 可以参考:
    http://expert.csdn.net/Expert/topic/2583/2583630.xml?temp=.9187128(线程的)关于全局键盘钩子,只能用其它语言编写成dll,供vb调用,这有一个例子,你可以参考一下(下载速度可能会较慢):
    http://www.freevbcode.com/code/fVBKeyLog.zip
      

  3.   

    那个全局的zip不能下,继续顶一下
      

  4.   

    有一个不太好的办法:
    随时检测当前窗口是否是IE,如果是则将F5注册系统热键(导致冲突,达到屏蔽F5的目的),如果不是则取消注册。
    类似的我试过,没问题。
      

  5.   

    //那个全局的zip不能下,继续顶一下我试过可以呀
      

  6.   

    因为HOOK经较特殊,单纯用VB是做不来的.
    如果你真的要做,只能用C++开发一个DLL来,你如果需要该DLL(其实,很多VB的网站都提供该DLL).给我EMAIL:
    [email protected]
      

  7.   

    最简单的方法
    用registerhotkey 注册一个热键,然后在子类里吃掉该键的消息就行了。
    给你一个例子:
    '------------------------------------------------------
    '下面的代码在窗体中
    Private Sub Form_Load()
    RegisterWindow Me.hwnd
    RegisterHotKey Me.hwnd, &H99CC, 0, vbKeyF5
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    unRegisterWindow Me.hwnd
    End Sub
    '下面的代码在模块中Option Explicit
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public 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
    Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
    Public Const WM_HOTKEY = &H312
    Public Const WM_SHOWWINDOW = &H18
    Public oldproc As LongPublic Function RegisterWindow(hwnd As Long) As Long
    If hwnd <> 0 Then
      oldproc = SetWindowLong(hwnd, -4, AddressOf WinProc)
    End If
    End Function
    Public Function unRegisterWindow(hwnd As Long) As Long
     
    If hwnd <> 0 Then
       SetWindowLong hwnd, -4, oldproc
    End IfEnd Function
    Public Function WinProc(ByVal hwnd As Long, ByVal msg As Long, ByVal lpara As Long, ByVal wpara As Long) As Long
    If msg = WM_HOTKEY Then
    If lpara = &H99CC Then Exit Function
    End IfWinProc = CallWindowProc(oldproc, hwnd, msg, lpara, wpara)End Function
    '结束
    '该程序在WIN2000+VB6下调试通过,2004.1.18