当前位置:编程学习 > VB >>

初学VB,问个关于command_click和keydown事件同时存在焦点设置的问题

刚学了几天VB,在个通信程序,需要四个command对象,分别是上、下、左、右方向按键,其中按键的click事件正常,我想用键盘的↑↓←→键触发窗体的keydown事件来调用按键对象的sub过程,从而实现双操作方式,,,但是,当我按键存在的时候窗体的keydown事件不能捕获到,焦点在command button上来回串,,,怎么实现键盘按键的捕获呢?不能用command button的enabled属性去让按键失效。
谢谢~
keydown VB 对象 command --------------------编程问答-------------------- 我想用的是键盘上 ↑↓←→键控制,我设置过form的keypreview属性,但是用↑↓↔键还是不行呢~望指点 --------------------编程问答-------------------- 当焦点不在FORM时怎么还能用FORM的捕获
改用勾子全局捕获按键 --------------------编程问答--------------------
引用 2 楼 SongPixy 的回复:
当焦点不在FORM时怎么还能用FORM的捕获
改用勾子全局捕获按键

呵呵,刚学几天,不太了解,谢谢~我去了解下 钩子。 --------------------编程问答-------------------- 如果焦点是在按键上,键盘的方向键已经在VB内部用于窗口上的控件间移动焦点,并没有发出Keydown消息,因此,lz的这样的用途是无法实现的,必须对按键的事件进行子类化处理 --------------------编程问答-------------------- 友情提醒一下:
带钩的程序都有可能被报毒

想了个笨办法
在每一个可以获取焦点的地方都加上KeyPress
然后Case出方向键来 --------------------编程问答-------------------- 方向键没有keypress事件哦 --------------------编程问答--------------------
引用 6 楼 worldy 的回复:
方向键没有keypress事件哦

哦,对,是KeyDown
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyUp
      CMD_Up_Click
    Case vbKeyDown
      CMD_Down_Click
    Case vbKeyLeft
      CMD_Left_Click
    Case vbKeyRight
      CMD_Right_Click
    Case Else
    End Select
End Sub

Private Sub CMD_Up_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyUp
      CMD_Up_Click
    Case vbKeyDown
      CMD_Down_Click
    Case vbKeyLeft
      CMD_Left_Click
    Case vbKeyRight
      CMD_Right_Click
    Case Else
    End Select
End Sub

'...
--------------------编程问答-------------------- 用上段测试了
在控件里截不了方向键
--------------------编程问答-------------------- 想到一个办法了
在Form里添加一个Text作为截取方向键的容器
因为不能设置隐藏只好将其移出Form显示范围之外
然后将TabIndex设为0

当点击按钮后要记得将焦点转回Text

下段程序已测试通过:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyUp
      Label1.Caption = "UP"
    Case vbKeyDown
      Label1.Caption = "Down"
    Case vbKeyLeft
      Label1.Caption = "Left"
    Case vbKeyRight
      Label1.Caption = "Right"
    Case Else
    End Select
End Sub

Private Sub Cmd_Up_Click()
  Label1.Caption = "UP"
  Text1.SetFocus
End Sub

Private Sub Cmd_Down_Click()
  Label1.Caption = "Down"
  Text1.SetFocus
End Sub

Private Sub Cmd_Left_Click()
  Label1.Caption = "Left"
  Text1.SetFocus
End Sub

Private Sub Cmd_Right_Click()
  Label1.Caption = "Right"
  Text1.SetFocus
End Sub
--------------------编程问答-------------------- 将所有down改为up再试试? --------------------编程问答--------------------
箭头键的功能在系统中已经预先定义为控件之间的焦点转移。

要拦截键盘消息,需要用到钩子。这对初学者来说,复杂了一点。

不过你可以采用一个偷懒的办法,让用户使用小键盘上的数字键 2, 4, 6, 8:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyNumpad8
            Command1.SetFocus
            Command1_Click
            
        Case vbKeyNumpad2
            Command2.SetFocus
            Command2_Click
            
        Case vbKeyNumpad4
            Command3.SetFocus
            Command3_Click
            
        Case vbKeyNumpad6
            Command4.SetFocus
            Command4_Click
    End Select
End Sub
--------------------编程问答-------------------- 不要用COMMAND按钮,用标签代替,在标签的Click()事件中处理原COMMAND按钮的Click()事件。
同时将FORM的keypreview属性设置为TRUE
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,