Определение состояния клавиш Ctrl и Shft

Программирование на Visual Basic for Applications
Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Определение состояния клавиш Ctrl и Shft

Сообщение Евгений Д. » 14.12.2007 (Пт) 14:09

На кнопку некой панели назначена процедура DisplayKeyStatus:

Код: Выделить всё
Option Explicit

Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

'   Константы клавиш
    Const VK_SHIFT As Integer = &H10
    Const VK_CONTROL As Integer = &H11
    Const VK_MENU As Integer = &H12 'клавиша Alt

Sub DisplayKeyStatus()
    Dim TabChar As String * 1
    Dim CRChar As String * 1
    Dim Shift As Boolean, Control As Boolean, Alt As Boolean
    Dim Msg As String
   
    TabChar = Chr(9)
    CRChar = Chr(13)

'   Использование функции API для определения нажатой клавиши
    If GetKeyState(VK_SHIFT) < 0 Then Shift = True Else Shift = False
    If GetKeyState(VK_CONTROL) < 0 Then Control = True Else Control = False
    If GetKeyState(VK_MENU) < 0 Then Alt = True Else Alt = False

'   Создание сообщения
    Msg = "Shift:" & TabChar & Shift & CRChar
    Msg = Msg & "Control:" & TabChar & Control & CRChar
    Msg = Msg & "Alt:" & TabChar & Alt & CRChar
   
'   Отображение сообщения
    MsgBox Msg, vbInformation, "Состояние клавиш"
End Sub


Код взят из материалов к книге Д.Уокенбаха "Профессиональное программирование на VBA в Ecxel 2002". Вопросы:

1. почему при обновременном удержании левых Ctrl+Shft и клике на кнопке по MsgBox выводится False, False (!?), при удержании правых Ctrl+Shft и клике на кнопке - все работает правильно. Если заменить GetKeyState на GetAsyncKeyState - результат тот же.

2. Есть ли возможность отключить в Excel его собственную реакцию на нажатие клавиши Alt, т.к. хочется запускать программу по клику на кнопке при нажатом Alt и ветвить алгоритм в зависимости от состояния клавиши Alt в момент запуска программы.

Если бы все клавиши Ctrl, Shft и Alt "дружили" во всех сочетаниях с кликом на кнопке, то, в идеальном случае, можно было бы иметь 8 вариантов ветвления алгоритма программы:

1. Click - работает
2. Ctrl+Click - работает
3. Shft+Click - работает

4. Ctrl+Shft+Click - врёт для левых клавиш

5. Alt+Click - не работает
6. Ctrl+Alt+Click - не работает
7. Shft+Alt+Click - не работает
8 Ctrl+Shft+Alt+Click - не работает

Откликнитесь, пожалуйста, кто в этом уже разобрался.

Евгений Д.
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 21.09.2004 (Вт) 17:32
Откуда: Москва

Сообщение Евгений Д. » 14.12.2007 (Пт) 14:53

По пункту 1 - беру свои претензии обратно, т. к. на комбинации Ctrl+Shft+Click сидел вызов словаря Multilex. Хотя, чтобы не "тормозить" в аналогичных случаях, сформулирую вопрос иначе: как определить переназначена ли определенная комбинация клавиш для другой программы (конкретно - Ctrl+Shft+LeftClick)?

По пункту 2 - вопрос остается.


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 114

    TopList