Страница 1 из 2
Событие нажатия клавиши с клавиатуры в VBA
Добавлено: 18 окт 2005, 13:32
Avsha
Всем добрый день,
Помогите прояснить следующий вопрос.
Могу ли я составить и распознать в VBA следующие сочетания клавиш клавиатуры ?
Ctrl-Shift-Q-F1, Ctrl-Shift-Q-F2 и т.д.
Ctrl-Shift-W-F1, Ctrl-Shift-W-F2 и т.д.
т.е. состоящие из четырех клавиш.
Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
Добавлено: 19 окт 2005, 15:57
sergvk
Просто мне необходимо получить 60 сочетаний клавиш, по которым затем производить действия и желательно таких, чтобы их было трудно нажать при нормальной работе за ПК.
... и тогда Ваша табличка будет похожа на тренажер пилотирования вертолета -

)) Не проще будет создать свое меню или панель инструментов ?
Добавлено: 20 окт 2005, 00:07
Naeel Maqsudov
У листа и книги событий нажатия кливиш просто нету.
Application.OnKey
может обрабатывать только одну клавишу (стандартную комбинацию клавиш).
Причем в процедуру-обработчик нельзя передать какая клавиша была нажата.
Кроме того, Application.OnKey переопределяет клавиши для всего приложения, т.е.
будет действовать во всех открытых данным экземпляром Excel книгах...
Стало быть Application.OnKey НЕ ПОДХОДИТ.
:-Е Обложили со всех сторон....
Добавлено: 20 окт 2005, 06:45
Avsha
sergvk,
да действительно, я хочу использовать пульт - технологическую клавиатуру с программируемыми кнопками,
которым можно назначить любое сочетание клавиш, вплоть до того чтобы выводить любой символ, например значок градуса.
Naeel Maqsudov,
Вот у меня и проблема, что клавиатура может сгенерировать любой код - а VBA его принять не может, получить как событие.
И признаюсь, VBA я использую не для Excel, а в SCADA-пакете автоматизации. Там тоже свое дерево объектов, но они ловят нажатие клавиш как объекты с событием _KeyDown, т.е. сочетания типа Ctrl-Shift-Q.
Просто вопрос задавал, чтобы прояснить общие принципы, может ли VBA поймать, например, значок градуса (код символа - 0xB0 = 176) ?
Добавлено: 20 окт 2005, 16:56
Дмит
Можно попробовать так: сочетание 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
Добавлено: 20 окт 2005, 21:56
Avsha
Дмит,
Что-то несовсем понял, куда в Excel вставлять приведенный вами код ?
Но правильней всё делать через API
Расскажите если не затруднит, это как ?
К моей клавиатуре прикладывается софт на ее перепрограммирование
и софт, который как-то связан с API.
Добавлено: 20 окт 2005, 22:51
Дмит
Насчёт кода
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
Добавлено: 21 окт 2005, 05:48
Avsha
Дмит,
хорошо, спасибо, посмотрю функции.
Насчет куда вставлять код, разобрался,
но условие -
If GetKeyState(VK_F1) < 0 Then
. ...
End If
ловит только сочетание Ctrl-Shift-F1, 4 клавиши не получается

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