Попытка создать клавиатуру для приложения VB.Net

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

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


person Skitzafreak    schedule 30.01.2019    source источник
comment
@MartinParkin Потому что руководство попросило меня создать клавиатуру для использования с приложением: P   -  person Skitzafreak    schedule 30.01.2019
comment
Для вашей первой проблемы вы уверены, что фокус установлен на что-то, что может получать ввод? Я имею в виду текстовое поле или что-то в этом роде.   -  person preciousbetine    schedule 30.01.2019
comment
@preciousbetine Да, я выбираю текстовое поле, а затем нажимаю кнопку. Может ли проблема заключаться в том, что кнопка изменилась на элемент, находящийся в фокусе, к тому времени, когда она попадает в метод SendKey? Как мне предотвратить это?   -  person Skitzafreak    schedule 30.01.2019
comment
В первой строке события нажатия кнопок попробуйте вернуть фокус в текстовое поле с помощью Textbox.Focus   -  person preciousbetine    schedule 30.01.2019
comment
@preciousbetine Хорошо, это решает мою проблему. Что-то вроде. Однако теперь проблема заключается в том, что я буду открывать и закрывать несколько форм, которые могут использовать клавиатуру. Таким образом, просто установка TextBox.Focus точно не поможет выяснить, какой конкретный элемент нуждается в фокусе. Есть ли метод SelectLastFocus или что-то, что я могу использовать? Кажется, я не могу найти его.   -  person Skitzafreak    schedule 30.01.2019


Ответы (1)


Это решение, которое не использует SendKeys. Не беспокойтесь о Фокусе. Вместо этого я отправляю TextBox, который должен получить ввод в поле на клавиатуре. Теперь форма KeyPad знает, куда отправлять ввод. Я назначил один обработчик для всех кнопок клавиатуры. Приведите отправителя обратно к кнопке и используйте свойство .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
person Mary    schedule 30.01.2019
comment
Что бы я сделал, если бы были ячейки DataGridView, которые я хотел бы использовать с клавиатурой? Не только текстовые поля. - person Skitzafreak; 30.01.2019
comment
Хотя об этом не знал. Я отредактирую ответ, чтобы показать несколько мыслей. - person Mary; 30.01.2019
comment
Я не думаю, что понимаю ваше решение. - person preciousbetine; 01.02.2019
comment
@драгоценныйбетин, я попытаюсь объяснить. Какая часть не понятна? - person Mary; 02.02.2019
comment
Теперь я это понимаю, но нет необходимости в приведении типов. Просто используйте объект и его текстовое свойство. Хотя вы не увидите sender.Text в качестве опции, но она работает. Благодаря этому вы даже можете использовать более широкий набор элементов управления. - person preciousbetine; 02.02.2019
comment
Объект @preciousbetine не имеет свойства .Text или свойства .Value. Я делаю Cast для доступа к свойствам базового типа. - person Mary; 02.02.2019
comment
@preciousbetine Ну, я только что сделал, и он не будет компилироваться с включенной опцией Strict. Вы не держите Option Strict включенным? - person Mary; 02.02.2019
comment
И по-прежнему будет проблема с фокусировкой, потому что после отображения клавиатуры TextOutputControl устанавливается на что-то. И изменение фокуса на другой элемент управления не приводит к автоматическому изменению TextOutputControl на этот элемент управления. - person preciousbetine; 02.02.2019
comment
Давайте продолжим обсуждение в чате. - person Mary; 02.02.2019