有FORM1,FORM2,焦点在FORM2,要运行FORM1的AAA():
               CALL  FORM1.AAA()

解决方案 »

  1.   

    方法一:使用HotKey控件,注册一个系统热键方法二:使用API函数,SetWindowsHookEx
                                             
      

  2.   

    请兄弟们说明HOOK的详细用法,最好有例子!
      

  3.   

    Q168795 HOWTO: Hook Into a Window's Messages Using AddressOf
    http://support.microsoft.com/support/kb/articles/q168/7/95.asp
      

  4.   

    通使用RegisterHotkey API来完成。 使用RegisterHotkey的概念是,它会定义一组按键的组合,当使用者不管在哪个程式之中,按下Window有注册的HotKey时,OS会传送WM_HOTKEY 的讯息给待接收该讯息的Window,而该Window收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以从wParam, lParam来得知是哪一组HotKey被按下。 RegisterHotKey( 
    ByVal hwnd As Long , //接收Hotkey的Window 
    ByVal idHotKey as Long, // identifier of hot key,range 0x0000 through 0xBFFF 
    ByVal Modifiers As Long, // 定义alt shift control等的组合 
    ByVal uVirtKey As Long // virtual-key code 
    ) WM_HOTKEY 叁数的定义 
    idHotKey = wParam; // identifier of hot key 
    Modifiers = (UINT) LOWORD(lParam); // key-modifier flags 
    uVirtKey = (UINT) HIWORD(lParam); // virtual-key code 所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按下;最後,程式结束前要使用UnRegisterHotkey将HotKey的定义取消掉。 以下程式功能是:不管在哪个程式中,只要按下ALT-SHIFT-G 便执行NotePad。 
    '以下在.Bas 
    Option Explicit Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ 
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ 
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long 
    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 
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long 
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long Public Const WM_HOTKEY = &H312 
    Public Const MOD_ALT = &H1 
    Public Const MOD_CONTROL = &H2 
    Public Const MOD_SHIFT = &H4 
    Public Const GWL_WNDPROC = (-4) Public preWinProc As Long 
    Public Modifiers As Long, uVirtKey As Long, idHotKey As Long Private Type taLong 
    ll As Long 
    End Type Private Type t2Int 
    lWord As Integer 
    hword As Integer 
    End Type Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _ 
    ByVal wParam As Long, ByVal lParam As Long) As Long 
    If Msg = WM_HOTKEY Then 
    If wParam = idHotKey Then 
    Dim lp As taLong, i2 As t2Int 
    lp.ll = lParam 
    LSet i2 = lp 
    If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then 
    Debug.Print "HotKey Shift-Alt-G Pressed " 
    Shell "notepad", vbNormalFocus 
    End If 
    End If 
    End If 
    '将之送往原来的Window Procedure 
    wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam) 
    End Function '以下在 Form 
    Sub Form_Load() 
    Dim ret As Long 
    preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) 
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc) 
    idHotKey = 1 'in the range &h0000 through &hBFFF 
    Modifiers = MOD_ALT + MOD_SHIFT 
    uVirtKey = vbKeyG 
    ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey) 
    End Sub Private Sub Form_Unload(Cancel As Integer) 
    Dim ret As Long 
    '取消Message的截取,而使之又只送往原来的Window Procedure 
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc) 
    Call UnregisterHotKey(Me.hwnd, uVirtKey) 
    End Sub