|||||在线求答案||||| 我怎么样才能在我程序运行的时候捕捉到用户按下了键盘中的某个键 进而触发一个事件??

yanzeyuan 2004-01-07 03:59:09
|||||在线求答案||||| 我怎么样才能在我程序运行的时候捕捉到用户按下了键盘中的某个键 进而触发一个事件??

我用form的keydown keyup不行啊,如果form上什么控键都没有的话可以,一旦有控件我运行程序的时候按下键盘中的任何健都没有反映了。

并且我也式过捕捉消息,可是我捕捉不到键盘按下的消息啊?

求解心切,请各位相助!
...全文
62 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yk84 2004-01-13
  • 打赏
  • 举报
回复
用键盘钩子也可以.
pegdw 2004-01-09
  • 打赏
  • 举报
回复
在 keydown 事件中截取keycode的值如:
 select case keycode
case 9
msgbox "TAB"
case 13
msgbox "Enter"
end select
TimLee✿ 2004-01-07
  • 打赏
  • 举报
回复

最主要是把form的KeyPreview属性设为true

form就可以最先接受键盘事件了!
lk_cool 2004-01-07
  • 打赏
  • 举报
回复
不管什么操作,操作完毕后、焦点回到text上就可以响应键盘了。
lk_cool 2004-01-07
  • 打赏
  • 举报
回复
原因是窗体上的控件本身有键盘事件,所以不再响应

你可以在窗体上放一个text控件

不管什么操作,焦点总在text上就可以响应键盘了。
hhjjhjhj 2004-01-07
  • 打赏
  • 举报
回复
如果你的窗体中控件种类不是很多,如下方法也可
(示例为TextBox,CommandButton二种)

Private WithEvents myTXT As TextBox
Private WithEvents myCMD As CommandButton

Private Sub Form_Activate()
whatCTR
End Sub

Private Sub myCMD_KeyPress(KeyAscii As Integer)
MsgBox "P"
End Sub

Private Sub myCMD_LostFocus()
whatCTR
End Sub

Private Sub myTXT_KeyPress(KeyAscii As Integer)
MsgBox "L"
End Sub

Private Sub myTXT_LostFocus()
whatCTR
End Sub

Sub whatCTR()
If TypeOf Me.ActiveControl Is TextBox Then Set myTXT = Me.ActiveControl
If TypeOf Me.ActiveControl Is CommandButton Then Set myCMD = Me.ActiveControl
End Sub
paoluo 2004-01-07
  • 打赏
  • 举报
回复
用KeyDown也可以啊。

eg:
Private Sub Form_Load()
Me.KeyPreview = True
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF2
MsgBox "F2"
End Select
End Sub

rainstormmaster 2004-01-07
  • 打赏
  • 举报
回复
如何拦截键盘输入

  这是使用Keyboard Hook 的范例,它的解释请查VB5 Call WinAPI技巧或Hook的简介
'以下在.Bas
Option Explicit

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 hnexthookproc As Long
Public Const HC_ACTION = 0
Public Const WH_KEYBOARD = 2

Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hnexthookproc
hnexthookproc = 0
End If
End Sub
Public Function EnableKBDHook()
If hnexthookproc <> 0 Then
Exit Function
End If
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
MyKBHFunc, App.hInstance, 0)
If hnexthookproc <> 0 Then
EnableKBDHook = hnexthookproc
End If
End Function
Public Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'这三个参数是固定的,不能动,而MyKBHFunc这个名称只要和
'SetWindowsHookex()中 AddressOf後的名称一样便可,不一定叫什麽
'wParam 是传入按了哪个key的virtual-key code

'如果您将以下的两行unmark则所有键盘的输入皆没有作用
'MyKBHFunc = 1 '吃掉信息
'Exit Function

MyKBHFunc = 0 '信息要处理
If iCode < 0 Then
MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
Exit Function
End If
If wParam = vbKeySnapshot Then '侦测 有没有按到PrintScreen键
MyKBHFunc = 1 '在这个Hook便吃掉这个信息
Debug.Print "haha"
Else
Call CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
End If
End Function

'以下在Form
Private Sub Form_Load()
Call EnableKBDHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub

rainstormmaster 2004-01-07
  • 打赏
  • 举报
回复
Private Sub Form_KeyPress(KeyAscii As Integer)
Debug.Print KeyAscii
End Sub

Private Sub Form_Load()
Me.KeyPreview = True
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧