Сочетания клавиш

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сочетания клавиш

Сообщение Алексей.Ф. » 14.10.2005 (Пт) 12:29

Всем здравствуйте! Кто знает, подскажите, как в ВБ программно назначить сочетания "горячих клавиш"? Типа Ctrl+1 и т.д.
Если делать так:
Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
.....
End If
End Sub

то получается назначить только одну клавишу.
Кто знает, как быть?

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 14.10.2005 (Пт) 12:45

Сделай Select Case и обрабатывай там сколько хочешь клавишь.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.10.2005 (Пт) 12:53

Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 75 And Shift = 2 Then
    MsgBox "Ctrl+K"
End If
End Sub

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 14.10.2005 (Пт) 13:13

Amed писал(а):
Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 75 And Shift = 2 Then
    MsgBox "Ctrl+K"
End If
End Sub

Спасибо, работает. Амед, как я понял Shift = 2 соответствует нажатой Ctrl. Какие у этого Shift могут быть ещё значения?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.10.2005 (Пт) 13:17

Используйте

а) vbAltMask
б) vbCtrlMask
в) vbShiftMask

Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = vbAltMask+vbCtrlMask Then
    MsgBox "Alt+Ctrl"
End If
End Sub

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 14.10.2005 (Пт) 13:23

Вот - то, о вреде чего я всегда говорил. Люди подставляют числовые значения системных констант, а потом в трех соснах не видят леса:
MSDN писал(а):If you need to test for the shift argument, you can use the shift constants which define the bits within the argument. The constants have the following values:

Код: Выделить всё
Constant        Value Description
vbShiftMask       1    SHIFT key bit mask.
VbCtrlMask        2    CTRL key bit mask.
VbAltMask         4     ALT key bit mask.


The constants act as bit masks that you can use to test for any combination of keys.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.10.2005 (Пт) 13:38

Ennor, это метеорит в мой огород?

Не катит. Я заглянул в Object Browser первым делом :).

Object Browser писал(а):Const vbAltMask = 4
Member of VBRUN.ShiftConstants
Alt key bit mask.

Const vbCtrlMask = 2
Member of VBRUN.ShiftConstants
Ctrl key bit mask.

Const vbShiftMask = 1
Member of VBRUN.ShiftConstants
Shift key bit mask.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 14.10.2005 (Пт) 13:46

Имхо лучше использовать Select Case'ы вложенные, чем через AND проверять нажатие двух клавиш в IF'ах.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.10.2005 (Пт) 13:48

Лучше добавлять в коллекцию айтемы по ключу KeyCode<<16 | Shift, а потом проверять, нет ли их там...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Алексей.Ф.
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 09.09.2004 (Чт) 20:55
Откуда: г. Ставрополь

Сообщение Алексей.Ф. » 14.10.2005 (Пт) 14:34

GSerg писал(а):Лучше добавлять в коллекцию айтемы по ключу KeyCode<<16 | Shift, а потом проверять, нет ли их там...

А это как?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 15.10.2005 (Сб) 1:38

Amed писал(а):Я заглянул в Object Browser первым делом :).

То, что ты туда заглянешь, я знаю :). Но в примерах лучше писать не 2, а VbCtrlMask, чтобы человек знал, куда смотреть.

Впрочем, это я наверное придираюсь. Извини :).

2 GSerg: это ничего, что в VB6 нет битового сдвига в таком виде, как у тебя указано?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.10.2005 (Сб) 2:39

Да пофигу, хоть cstr(keycode) & "Ы" & cstr(shift), главное принцип...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2005 (Пн) 17:09

Код: Выделить всё
Select Case RecognizeKeyCode(KeyCode, Shift)
  Case "Ctrl+1"
    MsgBox ...
End Select


Код: Выделить всё
Function RecognizeKeyCode(KeyCode As Integer, Shift As Integer) As String
Dim Z As String, K As String
If KeyCode = 0 Then Exit Function
Z = ""
If (Shift And vbCtrlMask) = vbCtrlMask Then Z = Z & IIf(Len(Z) > 0, "+", "") & "Ctrl"
If (Shift And vbAltMask) = vbAltMask Then Z = Z & IIf(Len(Z) > 0, "+", "") & "Alt"
If (Shift And vbShiftMask) = vbShiftMask Then Z = Z & IIf(Len(Z) > 0, "+", "") & "Shift"
Select Case KeyCode
  Case KeyCodeConstants.vbKey0 To KeyCodeConstants.vbKey9
    K = Chr$(Asc("0") + KeyCode - KeyCodeConstants.vbKey0)
  Case KeyCodeConstants.vbKeyA To KeyCodeConstants.vbKeyZ
    K = Chr$(Asc("A") + KeyCode - KeyCodeConstants.vbKeyA)
  Case KeyCodeConstants.vbKeyF1 To KeyCodeConstants.vbKeyF16
    K = "F" & Trim$(Str$(KeyCode - KeyCodeConstants.vbKeyF1 + 1))
  Case KeyCodeConstants.vbKeyNumpad0 To KeyCodeConstants.vbKeyNumpad9
    K = "Num" & Chr$(Asc("0") + KeyCode - KeyCodeConstants.vbKeyNumpad0)
  Case KeyCodeConstants.vbKeyAdd
    K = "Gray+"
  Case KeyCodeConstants.vbKeyBack
    K = "BS"
  Case KeyCodeConstants.vbKeyCancel
    K = "Cancel"
  Case KeyCodeConstants.vbKeyCapital
    K = "CapsLock"
  Case KeyCodeConstants.vbKeyClear
    K = "Clear"
  Case KeyCodeConstants.vbKeyControl
    K = "" 'Ctrl
  Case KeyCodeConstants.vbKeyDecimal
    K = "Gray."
  Case KeyCodeConstants.vbKeyDivide
    K = "Gray/"
  Case KeyCodeConstants.vbKeyDown
    K = "Down"
  Case KeyCodeConstants.vbKeyEnd
    K = "End"
  Case KeyCodeConstants.vbKeyEscape
    K = "ESC"
  Case KeyCodeConstants.vbKeyExecute
    K = "Exec"
  Case KeyCodeConstants.vbKeyHelp
    K = "Help"
  Case KeyCodeConstants.vbKeyHome
    K = "Home"
  Case KeyCodeConstants.vbKeyInsert
    K = "Ins"
  Case KeyCodeConstants.vbKeyDelete
    K = "Del"
  Case KeyCodeConstants.vbKeyLButton
    K = "" 'Mouse: Left button
  Case KeyCodeConstants.vbKeyLeft
    K = "Left"
  Case KeyCodeConstants.vbKeyMButton
    K = "" 'Mouse: Middle button
  Case KeyCodeConstants.vbKeyMenu
    K = "" 'Alt (Menu)
  Case KeyCodeConstants.vbKeyMultiply
    K = "Gray*"
  Case KeyCodeConstants.vbKeyNumlock
    K = "NumLock"
  Case KeyCodeConstants.vbKeyPageDown
    K = "PgDn"
  Case KeyCodeConstants.vbKeyPageUp
    K = "PgUp"
  Case KeyCodeConstants.vbKeyPause
    K = "Pause"
  Case KeyCodeConstants.vbKeyPrint
    K = "Print"
  Case KeyCodeConstants.vbKeyRButton
    K = "" 'Mouse: Right button
  Case KeyCodeConstants.vbKeyReturn
    K = "Enter"
  Case KeyCodeConstants.vbKeyRight
    K = "Right"
  Case KeyCodeConstants.vbKeyScrollLock
    K = "ScrollLock"
  Case KeyCodeConstants.vbKeySelect
    K = "Select"
  Case KeyCodeConstants.vbKeySeparator
    K = "GrayEnter"
  Case KeyCodeConstants.vbKeyShift
    K = "" 'Shift
  Case KeyCodeConstants.vbKeySnapshot
    K = "Snapshot"
  Case KeyCodeConstants.vbKeySpace
    K = "Space"
  Case KeyCodeConstants.vbKeySubtract
    K = "Gray-"
  Case KeyCodeConstants.vbKeyTab
    K = "Tab"
  Case KeyCodeConstants.vbKeyUp
    K = "Up"
  Case 192
    K = "`"
  Case 189
    K = "-"
  Case 187
    K = "="
  Case 219
    K = "["
  Case 221
    K = "]"
  Case 186
    K = ";"
  Case 222
    K = "'"
  Case 220
    K = "\"
  Case 93
    K = "Menu"
  Case Else
    K = ""
End Select
If Len(K) > 0 And Len(Z) > 0 Then K = "+" & K
RecognizeKeyCode = Z & K
End Function
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.10.2005 (Пн) 17:17

alibek, написал замену GetKeyNameText? А зачем?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2005 (Пн) 17:29

Уже не помню, давно писал :)
Скорее всего, не знал о ней просто.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 120

    TopList