我正在为正在处理的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应用程序,就不会完全破坏键盘。
< / li>编辑:经过一些测试,结果表明如果将键盘设置为一个完全独立的项目,则键盘可以正常工作。因此事实证明,问题似乎出在我为之创建的最初项目的一部分中。
答案 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