Это решение, которое не использует SendKeys.Не беспокойтесь о Фокусе.Вместо этого я отправляю 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 может иметь любое имя по вашему желанию.
EDIT
Для использования с ячейкой 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