Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long      If Msg = WM_HOTKEY Then
          Select Case wParam 'wParam 值就是 key_idHotKey
              Case 1 '激活 3 个热键后,3 个热键所对应的操作,大家在其他的程序中,只要修改此处就可以了
                  query.WindowState = 0
query.Show
Shell_NotifyIcon NIM_DELETE, tray
              Call getmydata
              
              X = Trim(query.bdh.Text)
X = X + 1
query.bdh.Text = X
              Case 2
                
                  query.Hide
Call tuopan              Case 3
                  
                  MsgBox "alt+3"
              Case 4
                  MsgBox "alt+4"
          End Select
      End If
    
'       将消息传送给指定的窗口
      keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
    
End FunctionFunction SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String)
      Dim KeyAss1 As Long
      Dim KeyAss2 As String
      Dim i As Long
    
      i = InStr(1, KeyAss0, ",")
      If i = 0 Then
          KeyAss1 = Val(KeyAss0)
          KeyAss2 = ""
      Else
          KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)
          KeyAss2 = Left(KeyAss0, i - 1)
      End If
    
      key_idHotKey = 0
      key_Modifiers = 0
      key_uVirtKey = 0
    
      If key_IsWinAddress = False Then    '判断是否需要取得窗口信息,如果重复取得,再最后恢复窗口时,将会造成程序死掉
'           记录原来的window程序地址
          key_preWinProc = GetWindowLong(query.hwnd, GWL_WNDPROC)
'           用自定义程序代替原来的window程序
          SetWindowLong query.hwnd, GWL_WNDPROC, AddressOf keyWndproc
      End If      key_idHotKey = KeyId
      Select Case Action
          Case "Add"
              If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL
              If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT
              If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT
              If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT
              If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT
              If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT
              If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT
              key_uVirtKey = Val(KeyAss1)
              RegisterHotKey query.hwnd, key_idHotKey, key_Modifiers, key_uVirtKey '向窗口注册系统热键
              key_IsWinAddress = True '不需要再取得窗口信息
            
          Case "Del"
              SetWindowLong query.hwnd, GWL_WNDPROC, key_preWinProc '恢复窗口信息
              UnregisterHotKey query.hwnd, key_uVirtKey '取消系统热键
              key_IsWinAddress = False '可以再次取得窗口信息
      End Select
End FunctionPublic Sub WriteToIni(ByVal Filename As String, ByVal Section As String, ByVal Key As String, ByVal Value As String)
    Dim buff As String * 128
    buff = Value + Chr(0)
    WritePrivateProfileString Section, Key, buff, Filename
End Sub
Public Function ReadFromIni(ByVal Filename As String, ByVal Section As String, ByVal Key As String) As String
    Dim i As Long
    Dim buff As String * 128
    GetPrivateProfileString Section, Key, "", buff, 128, Filename
    i = InStr(buff, Chr(0))
    ReadFromIni = Trim(Left(buff, i - 1))
End Function
其中ALT_1下为我的程序执行项,显示主窗口,并读数
ALT_2为隐藏窗口
我不知道怎么把这2个快捷键换成F10,F11,请帮忙改下,上述程序执行是没问题的

解决方案 »

  1.   

    上面多贴了段写INI的函数,这个别管,呵呵,贴多了
      

  2.   

    form的KeyPreview属性设置为true
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyF10 Then
            query.WindowState = 0
            query.Show
                    
            Shell_NotifyIcon NIM_DELETE, tray
            Call getmydata
            
            X = Trim(query.bdh.Text)
            X = X + 1
            query.bdh.Text = X
        ElseIf KeyCode = vbKeyF10 Then
            query.Hide
            Call tuopan
        End If
    End Sub
      

  3.   

    下面一个vbKeyF10 --->vbKeyF11