- Код: Выделить всё
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 - не работает
Откликнитесь, пожалуйста, кто в этом уже разобрался.