|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Перехват сообщений клавиатуры
Всем привет!
Пишу что-то вроде программного движка, управляемого консольными командами. Хотелось бы сделать возможность забиндить команды к клавишам. Для этого выделил массив строк BINDLIST, в котором индекс соответствует ASCII-коду клавиши, а элементы - собственно команды (пустые строки "движок" игнорирует). Вызов команды выглядит так: Код:
function KeyboardHook(Code: integer; wParam: Word; lParam: LongInt): LongInt; begin if (Code = HC_ACTION) and (wParam <> 0) then begin Console.ProcessCmd(BINDLIST[wParam]); // здесь обращаемся к методу "движка", который анализирует и выполняет команду из массива Result:=0; end else Result:=CallNextHookEx(SysHook, Code, wParam, lParam); end; Увы, это не работает. Движок грамотно обрабатывает саму команду бинда, например, "bind Esc quit", добавляя в массив команду "quit" по индексу 27 (код клавиши Esc), но нажатие клавиши Esc после этого ни к чему не приводит. Если же вынести механизм перехвата в отдельную DLL, то как из нее обращаться к методу Код:
Console.ProcessCmd(BINDLIST[wParam]); Может, я неправильно оперирую параметрами Code / wParam / lParam? Ne timeas obscurum. |
#2
|
||||
|
||||
Вроде разобрался, дело все-таки было в параметрах:
Код:
function KeyboardHook(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if Code >= 0 then begin if (wParam = WM_KEYDOWN) then Console.ProcessCmd(BINDLIST[PBDLLHOOKSTRUCT(lParam).vkCode]); end; Result:=CallNextHookEx(0, Code, wParam, lParam); end; (Спасибо NumLock: http://www.delphisources.ru/forum/sh...37&postcount=6) Правда, теперь забавно наблюдать, как движок пытается найти соответствующую команду КАЖДОМУ нажатию клавиш, даже во время набора команды Придется заменить массив команд чем-то более умным... Ne timeas obscurum. |
#3
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Lothlorien (07.10.2016)
|
#4
|
||||
|
||||
Да, я на время отображения формы консоли отключаю перехват, а после закрытия включаю заново; вроде получилось то, что хотел
Спасибо, изучу исходник, пригодится ) Ne timeas obscurum. |