Эмуляция нажатия клавиш в TextBox

 
0
 
Visual Basic

В TextBox при нажатии комбинации клавиш Shift + стрелка вправо (влево) выделяется текст по одному символу. Есть потребность при нажатии этих клавиш выделять сразу, допустим, три символа. Т.е. надо сэмулировать троекратное нажатие Shift + стрелка вправо. Но как это запрограммировать?

asked 19:44, 27.06.2016
ava 

Answers (3)

Вообще, сэмулировать так:


        SendKeys "+{RIGHT}"

Но если такой код вставить в обработчик события нажатия клавиши, возникнет бесконечный цикл. Поэтому как-то так:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 16 And Shift = 1 Then
        Text1.SelStart = 0
        Text1.SelLength = 2
    End If
End Sub

answered 12:53, 28.06.2016
ava 
Но использование SelStart и SelLenght не подходит для комбинации Shift + стрелка влево.
  Кепкин | 28.06.2016, 19:03 


Почему? Вот так работает (в предыдущем примере ошибся с кодом клавиши):


Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    On Error Resume Next ' игнорируем недопустимые значения SelLength
    If KeyCode = 39 And Shift = 1 Then ' нажаты Shift + стрелка вправо
        Text1.SelLength = Text1.SelLength + 2
    End If
    If KeyCode = 37 And Shift = 1 Then ' нажаты Shift + стрелка влево
        Text1.SelLength = Text1.SelLength - 2
    End If
End Sub

По-хорошему, нужно, конечно, не игнорировать недопустимые значения, а проанализировать, ну и ещё можно навертеть проверок и условий, но в принципе, по-моему, идея верная.

edited 14:55, 29.06.2016
ava 
answered 14:34, 29.06.2016
ava 
Для Shift + стрелка влево идея не проходит. В Вашем примере длина выделенного текста просто уменьшается справа. А необходимо увеличивать длину Selength при одновременном смещением влево SelStart и при этом не изменять направление выделения.
  Кепкин | 29.06.2016, 15:51 


Ну хорошо, тогда так:

Dim RFlag%
Dim LFlag%
Sub EmuKeyRight()
    RFlag = 1
    DoEvents
    SendKeys "+{RIGHT}"
    DoEvents
    SendKeys "+{RIGHT}"
    DoEvents
    RFlag = 0
End Sub
Sub EmuKeyLeft()
    LFlag = 1
    DoEvents
    SendKeys "+{LEFT}"
    DoEvents
    SendKeys "+{LEFT}"
    DoEvents
    LFlag = 0
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 39 And Shift = 1 And RFlag = 0 Then
        EmuKeyRight
    End If
    If KeyCode = 37 And Shift = 1 And LFlag = 0 Then
        EmuKeyLeft
    End If
End Sub

edited 18:02, 29.06.2016
ava 
answered 18:01, 29.06.2016
ava 


Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit