尝试为VB.Net应用程序创建键盘

时间:2019-01-30 16:56:03

标签: vb.net on-screen-keyboard keypad

我正在为正在处理的VB.Net应用程序创建键盘。键盘的目的是帮助在没有鼠标或键盘的触摸板工作站上使用该应用程序的用户。

这是我用来设置键盘的代码:

Public Class Keypad

    Private Sub Keypad_Load(sender As Object, e As Event Args) Handles MyBase.Load
        Me.TopMost = True
    End Sub

    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Const WS_EX_NOACTIVATE As Int32 = &H8000000
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or WS_EX_NOACTIVATE
            Return cp
        End Get
    End Property

    Private Sub btn0_Click(sender As Object, e As EventArgs) Handles btn0.Click
        SendKeys.Send("0")
    End Sub

    Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
        SendKeys.Send("0")
    End Sub

    'all other button methods are the same as above

因此,键盘本身是一个简单的设置。标准数字键1-9布局,以及“清除”和“输入”按钮。

我目前在键盘上遇到以下问题:

  1. 在VB.Net中,我创建了键盘,但是尝试使用键盘无济于事。但是,如果我打开记事本并将焦点放在记事本上,则使用键盘会在记事本中键入数字。

  2. 该应用程序的登录屏幕已设置为“对话”窗口,但我无法对其进行修改(旧版代码问题)。这意味着在打开登录屏幕时,键盘既不可移动,又不可使用。

  3. 假定选择“清除”按钮后,将清除具有焦点的任何表单元素中的所有数据。但是,我不确定如何编程以及如何制作它,以确保如果用户在按下该键时没有专注于VB.Net应用程序,就不会完全破坏键盘。

    < / li>

编辑:经过一些测试,结果表明如果将键盘设置为一个完全独立的项目,则键盘可以正常工作。因此事实证明,问题似乎出在我为之创建的最初项目的一部分中。

1 个答案:

答案 0 :(得分:1)

这是不使用SendKeys的解决方案。不用担心Focus。相反,我将要接收输入的TextBox发送到KeyPad中的一个字段。现在,“键盘”表单知道了将输入发送到哪里。我已为所有键盘按钮分配了一个处理程序。将发送方强制转换回Button并使用按钮的.Text属性。

Public Class KeyPad
    Public TextOutputControl As TextBox
    Private Sub KeyPad_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
        Dim ClickedAmount As String = DirectCast(sender, Button).Text
        TextOutputControl.Text &= ClickedAmount
    End Sub
End Class

每个要使用键盘的表单上的...

Private Sub btnShowKeyPad_Click(sender As Object, e As EventArgs) Handles btnShowKeyPad.Click
    KeyPad.Show()
    KeyPad.TextOutputControl = TextBox1
End Sub

当然,TextBox可以具有您想要的任何名称。

编辑

要与DataGridView单元一起使用,请将TextOutputControl的数据类型更改为Object。您将需要检查传入的对象类型,然后将数据发送回去。

Public Class KeyPad
    Public TextOutputControl As Object
    Private Sub KeyPad_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
        Dim ClickedAmount As String = DirectCast(sender, Button).Text
        Dim t As Type = TextOutputControl.GetType
        Dim tTexBox As Type = GetType(TextBox)
        If t.Equals(GetType(TextBox)) Then
            DirectCast(TextOutputControl, TextBox).Text &= ClickedAmount
        Else
            Dim s = CStr(DirectCast(TextOutputControl, DataGridViewCell).Value)
            s &= ClickedAmount
            DirectCast(TextOutputControl, DataGridViewCell).Value = s
        End If
    End Sub
End Class

然后使用带有DataGridView的表单...

Private Sub btnShowKeyPad_Click(sender As Object, e As EventArgs) Handles btnShowKeyPad.Click
    KeyPad.Show()
    'KeyPad.TextOutputControl = TextBox1
    KeyPad.TextOutputControl = DataGridView1.CurrentCell
End Sub