Событие нажатия клавиши с клавиатуры в VBA
Модератор: Naeel Maqsudov
Всем добрый день,
Помогите прояснить следующий вопрос.
Могу ли я составить и распознать в VBA следующие сочетания клавиш клавиатуры ?
Ctrl-Shift-Q-F1, Ctrl-Shift-Q-F2 и т.д.
Ctrl-Shift-W-F1, Ctrl-Shift-W-F2 и т.д.
т.е. состоящие из четырех клавиш.
Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
Помогите прояснить следующий вопрос.
Могу ли я составить и распознать в VBA следующие сочетания клавиш клавиатуры ?
Ctrl-Shift-Q-F1, Ctrl-Shift-Q-F2 и т.д.
Ctrl-Shift-W-F1, Ctrl-Shift-W-F2 и т.д.
т.е. состоящие из четырех клавиш.
Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
-
- Сообщения: 129
- Зарегистрирован: 21 июн 2005, 14:33
- Откуда: Крым, Феодосия
- Контактная информация:
... и тогда Ваша табличка будет похожа на тренажер пилотирования вертолета -Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.

- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
У листа и книги событий нажатия кливиш просто нету.
Application.OnKey
может обрабатывать только одну клавишу (стандартную комбинацию клавиш).
Причем в процедуру-обработчик нельзя передать какая клавиша была нажата.
Кроме того, Application.OnKey переопределяет клавиши для всего приложения, т.е.
будет действовать во всех открытых данным экземпляром Excel книгах...
Стало быть Application.OnKey НЕ ПОДХОДИТ.
:-Е Обложили со всех сторон....
Application.OnKey
может обрабатывать только одну клавишу (стандартную комбинацию клавиш).
Причем в процедуру-обработчик нельзя передать какая клавиша была нажата.
Кроме того, Application.OnKey переопределяет клавиши для всего приложения, т.е.
будет действовать во всех открытых данным экземпляром Excel книгах...
Стало быть Application.OnKey НЕ ПОДХОДИТ.
:-Е Обложили со всех сторон....
sergvk,
да действительно, я хочу использовать пульт - технологическую клавиатуру с программируемыми кнопками,
которым можно назначить любое сочетание клавиш, вплоть до того чтобы выводить любой символ, например значок градуса.
Naeel Maqsudov,
Вот у меня и проблема, что клавиатура может сгенерировать любой код - а VBA его принять не может, получить как событие.
И признаюсь, VBA я использую не для Excel, а в SCADA-пакете автоматизации. Там тоже свое дерево объектов, но они ловят нажатие клавиш как объекты с событием _KeyDown, т.е. сочетания типа Ctrl-Shift-Q.
Просто вопрос задавал, чтобы прояснить общие принципы, может ли VBA поймать, например, значок градуса (код символа - 0xB0 = 176) ?
да действительно, я хочу использовать пульт - технологическую клавиатуру с программируемыми кнопками,
которым можно назначить любое сочетание клавиш, вплоть до того чтобы выводить любой символ, например значок градуса.
Naeel Maqsudov,
Вот у меня и проблема, что клавиатура может сгенерировать любой код - а VBA его принять не может, получить как событие.
И признаюсь, VBA я использую не для Excel, а в SCADA-пакете автоматизации. Там тоже свое дерево объектов, но они ловят нажатие клавиш как объекты с событием _KeyDown, т.е. сочетания типа Ctrl-Shift-Q.
Просто вопрос задавал, чтобы прояснить общие принципы, может ли VBA поймать, например, значок градуса (код символа - 0xB0 = 176) ?
Можно попробовать так: сочетание Ctrl-Shift-Q ловит Excel и в процедуре проверить нажатие F1.
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Const VK_F1 = &H70
Application.OnKey "+^q", "ses"
Sub Ses()
If GetKeyState(VK_F1) < 0 Then
....
End If
End Sub
Но правильней всё делать через API
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Const VK_F1 = &H70
Application.OnKey "+^q", "ses"
Sub Ses()
If GetKeyState(VK_F1) < 0 Then
....
End If
End Sub
Но правильней всё делать через API
Дмит,
Что-то несовсем понял, куда в Excel вставлять приведенный вами код ?
К моей клавиатуре прикладывается софт на ее перепрограммирование
и софт, который как-то связан с API.
Что-то несовсем понял, куда в Excel вставлять приведенный вами код ?
Расскажите если не затруднит, это как ?Но правильней всё делать через API
К моей клавиатуре прикладывается софт на ее перепрограммирование
и софт, который как-то связан с API.
Насчёт кода
1 создаём модуль и после Option Explicit объявляем функцию и константу(клавиша F1, можно и ещё конечно другие)
2 ниже вставляем код процедуры Ses, заменив точки на Ваш код, выполняемый по нажатию клавиш Ctrl-Shift-Q-F1
3 Application.OnKey "+^q", "ses" вставляем в процедуру, выполняемую при открытии Вашей книги
(AutoOpen в модуле или Private Sub Workbook_Open в блоке ЭтаКнига)
Насчёт API - копай функции:
ToAscii
GetKeyState
GetKeyboardState
GetAsyncKeyState
1 создаём модуль и после Option Explicit объявляем функцию и константу(клавиша F1, можно и ещё конечно другие)
2 ниже вставляем код процедуры Ses, заменив точки на Ваш код, выполняемый по нажатию клавиш Ctrl-Shift-Q-F1
3 Application.OnKey "+^q", "ses" вставляем в процедуру, выполняемую при открытии Вашей книги
(AutoOpen в модуле или Private Sub Workbook_Open в блоке ЭтаКнига)
Насчёт API - копай функции:
ToAscii
GetKeyState
GetKeyboardState
GetAsyncKeyState
Дмит,
хорошо, спасибо, посмотрю функции.
Насчет куда вставлять код, разобрался,
но условие -
If GetKeyState(VK_F1) < 0 Then
. ...
End If
ловит только сочетание Ctrl-Shift-F1, 4 клавиши не получается
хорошо, спасибо, посмотрю функции.
Насчет куда вставлять код, разобрался,
но условие -
If GetKeyState(VK_F1) < 0 Then
. ...
End If
ловит только сочетание Ctrl-Shift-F1, 4 клавиши не получается

Условие - If GetKeyState(VK_F1) < 0 Then проверяет нажата ли клавиша F1,
а .OnKey "+^q", "ses" создаёт горячее сочетание клавиш Ctrl-Shift-Q по которому выполняется процедура ses.
Я удерживая Ctrl-Shift-F1, нажимаю q и у меня всё срабатывает как надо.
а .OnKey "+^q", "ses" создаёт горячее сочетание клавиш Ctrl-Shift-Q по которому выполняется процедура ses.
Я удерживая Ctrl-Shift-F1, нажимаю q и у меня всё срабатывает как надо.
Все Ok, действительно работает,
значит с утра что-то промаргал
значит с утра что-то промаргал
