Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.10.2016, 17:31
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
Печаль Перехват сообщений клавиатуры

Всем привет!
Пишу что-то вроде программного движка, управляемого консольными командами. Хотелось бы сделать возможность забиндить команды к клавишам. Для этого выделил массив строк 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  
Старый 05.10.2016, 18:18
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Вроде разобрался, дело все-таки было в параметрах:

Код:
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  
Старый 06.10.2016, 15:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Lothlorien
...забавно наблюдать, как движок пытается найти соответствующую команду КАЖДОМУ нажатию клавиш, даже во время набора команды Придется заменить массив команд чем-то более умным...
Проще тогда отключать проверку набора состоянием глобального флажка или делать пакетную буферизацию во время набора команд. Не знаю конечной задачи, но посмотрите пжлст вот это, там тоже что-то связанное с набором "какбе команд" с клавы, БД можно выкинуть, вдруг подойдёт
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Lothlorien (07.10.2016)
  #4  
Старый 07.10.2016, 20:29
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Да, я на время отображения формы консоли отключаю перехват, а после закрытия включаю заново; вроде получилось то, что хотел
Спасибо, изучу исходник, пригодится )
__________________
Ne timeas obscurum.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter