Событие нажатия клавиши с клавиатуры в VBA

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Всем добрый день,

Помогите прояснить следующий вопрос.
Могу ли я составить и распознать в VBA следующие сочетания клавиш клавиатуры ?
Ctrl-Shift-Q-F1, Ctrl-Shift-Q-F2 и т.д.
Ctrl-Shift-W-F1, Ctrl-Shift-W-F2 и т.д.
т.е. состоящие из четырех клавиш.

Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
sergvk
Сообщения: 129
Зарегистрирован: 21 июн 2005, 14:33
Откуда: Крым, Феодосия
Контактная информация:

Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
... и тогда Ваша табличка будет похожа на тренажер пилотирования вертолета - :) )) Не проще будет создать свое меню или панель инструментов ?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

У листа и книги событий нажатия кливиш просто нету.

Application.OnKey
может обрабатывать только одну клавишу (стандартную комбинацию клавиш).
Причем в процедуру-обработчик нельзя передать какая клавиша была нажата.
Кроме того, Application.OnKey переопределяет клавиши для всего приложения, т.е.
будет действовать во всех открытых данным экземпляром Excel книгах...
Стало быть Application.OnKey НЕ ПОДХОДИТ.

:-Е Обложили со всех сторон....
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

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

Naeel Maqsudov,
Вот у меня и проблема, что клавиатура может сгенерировать любой код - а VBA его принять не может, получить как событие.
И признаюсь, VBA я использую не для Excel, а в SCADA-пакете автоматизации. Там тоже свое дерево объектов, но они ловят нажатие клавиш как объекты с событием _KeyDown, т.е. сочетания типа Ctrl-Shift-Q.

Просто вопрос задавал, чтобы прояснить общие принципы, может ли VBA поймать, например, значок градуса (код символа - 0xB0 = 176) ?
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Можно попробовать так: сочетание 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
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Дмит,
Что-то несовсем понял, куда в Excel вставлять приведенный вами код ?
Но правильней всё делать через API
Расскажите если не затруднит, это как ?
К моей клавиатуре прикладывается софт на ее перепрограммирование
и софт, который как-то связан с API.
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Насчёт кода
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
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Дмит,
хорошо, спасибо, посмотрю функции.

Насчет куда вставлять код, разобрался,
но условие -
If GetKeyState(VK_F1) < 0 Then
. ...
End If
ловит только сочетание Ctrl-Shift-F1, 4 клавиши не получается :(
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Условие - If GetKeyState(VK_F1) < 0 Then проверяет нажата ли клавиша F1,
а .OnKey "+^q", "ses" создаёт горячее сочетание клавиш Ctrl-Shift-Q по которому выполняется процедура ses.
Я удерживая Ctrl-Shift-F1, нажимаю q и у меня всё срабатывает как надо.
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Все Ok, действительно работает,
значит с утра что-то промаргал ;)
Ответить