允许通过键盘控制计算机键盘形式

时间:2014-05-27 06:15:59

标签: vb6

我在VB6中创建了一个拨号器来拨打电话号码。它有以下按钮:数字0-9,退格键,“呼叫”和“断开连接”。现在我想使用键盘的键盘部分在表单中输入数字。在文本框中,可以使用键盘输入任何键。但我只想让数字键盘运行。

为此,我使用KeyPress事件检查ASCII值 - 查看按下的键值是否介于47和58之间。但是除了键值之外,其ASCII值也会显示在文本框中。

还有一件事 - 我在表单上有一个MS Flex Grid和拨号器。因此,当光标位于表单上时,或者如果鼠标单击文本框以外的任何位置,则值不会显示在文本框中。那么我如何始终专注于文本框?

   Dim val As Integer

  Private Sub append(val As Integer)
  Text1.Text = Text1.Text & val
  End Sub   
  Private Sub Backspace_Click()
  With Text1
         'FOCUS TO THE TEXTBOX
         .SetFocus

         'PUT THE CURSOR AT THE END OF THE TEXT
         .SelStart = Len(.Text)

         'SEND THE KEY
         SendKeys ("{BACKSPACE}")

         'AND THATS IT :D
 End With
 End Sub

 Private Sub key_0_Click()
 val  = 0
 append val
 End Sub

 Private Sub key_1_Click()
 val = 1
 append val
 End Sub

 Private Sub key_2_Click()
 val = 2
 append val
 End Sub

 Private Sub key_3_Click()
 val = 3
 append val
 End Sub

 Private Sub key_4_Click()
 val = 4
 append val
 End Sub


 Private Sub key_5_Click()
 val = 5
 append val
 End Sub

 Private Sub key_6_Click()
 val = 6
 append val
 End Sub

 Private Sub key_7_Click()
 val = 7
 append val
 End Sub

 Private Sub key_8_Click()
 val = 8
 append val
 End Sub

 Private Sub key_9_Click()
 val = 9
 append val
 End Sub


 Private Sub Text1_KeyPress(KeyAscii As Integer)
 If (KeyAscii > 47 And KeyAscii < 58) Then
 val = KeyAscii
 append val
 Else
 KeyAscii = 0

'Text1.Text = KeyAscii      万一      结束子

'Private Sub Text1_LostFocus()
' Text1.SetFocus
'End Sub

2 个答案:

答案 0 :(得分:1)

您可以将表单上的KeyPreview属性设置为true。 完成后,将代码放在Textbox的KeyPress中的表单的KeyPress中,并设置文本框的文本值,或者更好地将代码移动到一个函数中并从那里设置它,这样一来如果您在其他地方需要,您不会需要复制代码。

看看这个,看它是否有助于KeyPreview from MSDN

您好, 抱歉耽搁了。要使用表单的KeyPreview,请尝试:

  1. 双击项目中的表单将其打开
  2. 在表单的属性中找到KeyPreview属性并将其设置为true Key Press from properties

  3. 双击表单以显示代码窗口

  4. 选择表单的按键事件,并添加以下代码或类似内容。

    Private Sub Form_KeyPress(KeyAscii As Integer)
        Text1.Text = Text1.Text & Chr$(NrOnly(KeyAscii))
    End Sub
    
  5. 使用Hqrls发布的NrOnly函数,因为它只允许帮助您进行验证的数字。您不会需要Text1_KeyPress中的任何代码,表单现在将为您处理。 尝试一下,如果您需要任何其他信息,请告诉我,我会看到我能做些什么。

    [EDIT 29/05/2014]

    您好,

    我已经对代码进行了一些游戏,并添加了一些我认为可能有用的内容。看看这个,看看它是否有意义。如果您将其复制到代码中,请确保备份原始代码,以防万一您需要回复它。

    如果您保留文本框

    ,这是代码
    Option Explicit
    
    Dim val                 As String
    Dim m_blnTextHasFocus   As Boolean 'Added this, so it knows wether the the textbox 
                                       'has  the focus or not
                                       'it is so the sendkeys doesn't get stuck in a 
                                       'loop with the key presses
    
    Private Sub append(strIn As String)
        'Changed the parameter from an int to a string, so we can use it in the key press events
        Text1.Text = Text1.Text & strIn
    End Sub
    
    Private Sub Backspace_Click()
        'Moved the code into it's own sub
        DeleteAChar
    End Sub
    
    Private Sub Form_KeyPress(KeyAscii As Integer)
        'Handle a key press if the textbox doesn't have the focus but ignore the keypress if it does
    
        If Not m_blnTextHasFocus Then
            If IsNumeric(Chr$(KeyAscii)) Then
                append Chr$(KeyAscii)
    
            ElseIf KeyAscii = vbKeyBack Then
                DeleteAChar
            End If
        End If
    
    End Sub
    
    Private Sub key_0_Click()
        val = "0"
        append val
    End Sub
    
    Private Sub key_1_Click()
        val = "1"
        append val
    End Sub
    
    Private Sub key_2_Click()
        val = "2"
        append val
    End Sub
    
    Private Sub key_3_Click()
        val = "3"
        append val
    End Sub
    
    Private Sub key_4_Click()
        val = "4"
        append val
    End Sub
    
    Private Sub key_5_Click()
        val = "5"
        append val
    End Sub
    
    Private Sub key_6_Click()
        val = "6"
        append val
    End Sub
    
    Private Sub key_7_Click()
        val = "7"
        append val
    End Sub
    
    Private Sub key_8_Click()
        val = "8"
        append val
    End Sub
    
    Private Sub key_9_Click()
        val = "9"
        append val
    End Sub
    
    Private Sub Text1_GotFocus()
        m_blnTextHasFocus = True
    End Sub
    
    Private Sub Text1_KeyPress(KeyAscii As Integer)
        'Check the keyascii value and ignore it if it isn't numeric or backspace
        If Not IsNumeric(Chr$(KeyAscii)) And KeyAscii <> vbKeyBack Then
            KeyAscii = 0
        End If
    
    End Sub
    
    Private Sub DeleteAChar()
        With Text1
            'FOCUS TO THE TEXTBOX
            .SetFocus
    
            'PUT THE CURSOR AT THE END OF THE TEXT
            .SelStart = Len(.Text)
    
            'SEND THE KEY
            SendKeys ("{BACKSPACE}")
    
            'AND THATS IT :D
        End With
    End Sub
    
    Private Sub Text1_LostFocus()
        m_blnTextHasFocus = False
    End Sub
    

    如果您不需要保留文本框,那么您可以用标签替换它并尝试使用它。它将消除跟踪文本框是否已获得焦点的需要。快来看看它是否有帮助。唯一的另一件事是确保为表单启用KeyPreview,或者只有具有焦点的按键代码才能用于表单。

答案 1 :(得分:0)

文本框是您想要获得焦点的唯一控件吗?

在这种情况下,您可以使用以下代码:

Private Sub Text1_LostFocus()
  Text1.SetFocus
End Sub

如果您还希望能够拥有其他任何控件,那么您可以在不希望具有焦点的控件的_GotFocus()事件中使用Text1.SetFocus

另一种可能的解决方案是使用其他控件的_KeyPress()事件,并将当前的Text1_KeyPress()事件转换为可由其他控件的_KeyPress()事件调用的常规函数​​。确保将此常规函数的输出发送到正确的文本框

如果您发布代码的相关部分,我们可以提供更具体的答案

<强> [编辑]

对于原始问题的答案,请使用表格上的keypreview来回答lardymonkey

仅允许使用数字键和退格键的示例函数:

Private Sub Text1_KeyPress(KeyAscii As Integer)
  KeyAscii = NrOnly(KeyAscii)
End Sub

Private Function NrOnly(intAscii As Integer) As Integer
  Dim intReturn As Integer
  intReturn = intAscii
  Select Case intAscii
    Case vbKeyBack
    Case vbKey0 To vbKey9
    Case Else
      intReturn = 0
  End Select
  NrOnly = intReturn
End Function