請問如何編寫代碼來實現KEYPRESS對按鈕的控制?例如:我想用“回車”來實現COMMAND1的功能,如何編寫KEYPRESS事件代碼?
熱心網友
首先要明確你所需要的“回車”替代COMMAND1是在哪種條件下的回車,比如form界面或者text框內,那就選擇Form_KeyPress事件或者Text_KeyPress事件。如果你需要的是一個全局的替代,也就是不管焦點在哪里,都可以“回車”替代COMMAND1,那就要用到hook技術或者是RegisterHotKey這個API函數,后者相對比較簡單,按下面的說法做就可以:在DOS時代,我們常用攔截中斷向量的方法來實現熱鍵的功能?,F在我們可以用RegisterHotKey這個API函數來定義熱鍵。當熱鍵注冊過后,無論我們在哪個程序中按下這組熱鍵,系統會把相關信息傳遞給等待接收這個信息的窗口,再由這個窗口來處理信息,完成指定功能。所以在接收信息的窗口中還要采用子分類的方法來處理,程序結束時用unRegisterHotKey來取消熱鍵的定義。 RegisterHotKey的參數結構如下: RegisterHotKey(ByVal hwnd As Long,//接收Hotkey的Window ByVal idHotKey as Long, // 熱鍵的ID,范圍從 0x0000 到 0xBFFF ByVal Modifiers As Long, // 定義alt shift control等的組合 ByVal uVirtKey As Long // 低端的鍵值 ) 下面我們就來看看具體程序,這個程序的功能是無論在哪個程序中按下ALT-SHIFT-G就執行記事本程序: '以下程序放在模塊中 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 '如果不是熱鍵信息則調用原來的程序 wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam) End Function '以下程序放在窗體中 Sub Form_Load() Dim ret As Long '記錄原來的window程序地址 preWinProc = GetWindowLong(Me。hwnd, GWL_WNDPROC) '用自定義程序代替原來的window程序 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程序 ret = SetWindowLong(Me。hwnd, GWL_WNDPROC, preWinProc) Call UnregisterHotKey(Me。hwnd, uVirtKey) End Sub 。
熱心網友
樓上的說的對,將Default設為True就行了
熱心網友
用回車執行,可以將按鈕的屬性:Default 設置為T.