![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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? |
|
#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) Правда, теперь забавно наблюдать, как движок пытается найти соответствующую команду КАЖДОМУ нажатию клавиш, даже во время набора команды Придется заменить массив команд чем-то более умным... |
|
#3
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Lothlorien (07.10.2016)
| ||
|
#4
|
||||
|
||||
|
Да, я на время отображения формы консоли отключаю перехват, а после закрытия включаю заново; вроде получилось то, что хотел
![]() Спасибо, изучу исходник, пригодится ) |