Попытка создать клавиатуру для приложения VB.Net - PullRequest
0 голосов
/ 30 января 2019

Я работаю над созданием клавиатуры для приложения 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

Таким образом, сама клавиатура является простой настройкой.Стандартная раскладка Numpad 1-9, а также кнопки «Очистить» и «Ввод».

В настоящее время у меня возникают следующие проблемы с клавиатурой:

  1. Хотяв VB.Net, для которого я создал клавиатуру, попытка использования клавиатуры ничего не делает.Однако, если я открываю Блокнот и фокусируюсь на Блокноте, с помощью клавиатуры вводятся цифры в Блокнот.

  2. Экран входа в систему для приложения настроен как диалоговое окно, и я не могучтобы изменить это (проблемы устаревшего кода).Это означает, что клавиатура является неподвижной и непригодной для использования, когда открыт экран входа в систему.

  3. Кнопка «Очистить» предполагает удаление всех данных в любом элементе формы, на котором есть фокус, когда кнопкавыбран.Тем не менее, я не совсем уверен, как запрограммировать это и как сделать так, чтобы он не вызывал неполадок в клавиатуре, если пользователь нажимает клавишу, не предназначенную для VB.Net, при нажатии клавиши.

РЕДАКТИРОВАТЬ: После некоторого тестирования оказывается, что клавиатура работает нормально, если я настроил ее как совершенно отдельный проект.Так что, похоже, проблема в том, что форма клавиатуры является частью первоначального проекта, для которого я ее создавал.

1 Ответ

0 голосов
/ 30 января 2019

Это решение, которое не использует 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
...