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

Posted

技术标签:

【中文标题】尝试为 VB.Net 应用程序创建键盘【英文标题】:Trying to create Keypad for VB.Net Application 【发布时间】:2019-01-30 16:56:02 【问题描述】:

我正在为我正在开发的 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 布局,以及“清除”和“输入”按钮。

我目前在使用键盘时遇到以下问题:

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

    应用程序的登录屏幕设置为对话窗口,我无法对其进行修改(遗留代码问题)。这意味着键盘在登录屏幕打开时既不能移动,也不能使用。

    “清除”按钮假定在选择按钮时删除任何具有焦点的表单元素中的所有数据。但是,我不完全确定如何对此进行编程,以及如何制作它,以便如果用户在按下键时关注的非 VB.Net 应用程序不会完全破坏键盘。

编辑:在做了一些测试后,如果我将它设置为一个完全独立的项目,结果证明键盘可以正常工作。所以事实证明问题似乎是键盘表单是我创建它的初始项目的一部分。

【问题讨论】:

@MartinParkin 因为管理层要求我创建一个键盘以用于该应用程序:P 对于您的第一个问题,您确定将焦点设置为可以接收输入的内容吗?我的意思是一个文本框或类似的东西。 @preciousbetine 是的,我正在选择一个文本框,然后按下按钮。问题是否可能是 Button 在到达 SendKey 方法时已更改为具有焦点的项目?我将如何阻止这种情况发生? 在按钮点击事件的第一行,尝试使用Textbox.Focus将焦点返回给文本框 @preciousbetine 好的,这解决了我的问题。有点儿。然而,现在的问题是我将打开和关闭多个可以使用键盘的表单。因此,仅仅输入TextBox.Focus 并不能完全帮助确定哪个特定元素需要关注。有SelectLastFocus 方法或我可以使用的方法吗?我好像找不到。 【参考方案1】:

这是一个不使用 SendKeys 的解决方案。不用担心焦点。相反,我将接收输入的文本框发送到键盘中的一个字段。现在 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

【讨论】:

如果 DataGridView 的单元格中有我想与键盘一起使用的单元格,我会怎么做?不仅仅是文本框。 没想到。我将编辑答案以显示一些想法。 我不认为我理解你的解决方案。 @preciousbetine 我会尝试解释。哪部分不清楚? 我现在明白了,但不需要类型转换。只需使用一个对象和它的文本属性。虽然您不会看到 sender.Text 作为选项,但它确实有效。有了它,您甚至可以使用更广泛的控件。

以上是关于尝试为 VB.Net 应用程序创建键盘的主要内容,如果未能解决你的问题,请参考以下文章

使用 VB.NET 创建 ODBC DSN

VB.NET的API调用

如何在 VB.NET 中为基于 Windows 的应用程序创建带有自动建议的文本框?

vb.net 应用程序将 xml 转换为文本

VB.Net保存word文档不提示

VB.NET CAD开发求助加载程序后如何设置为当前