Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2019, 01:18   #1
ugorek
 
Регистрация: 20.07.2017
Сообщений: 6
Восклицание Поток и хук на клавиатуру.

Здравствуйте. Я нуб. У меня была задача получать данные о нажатой клавиши в любой момент, и изначально я использовал GetKeyState() и было нормально. Но потом, с ростом программы, когда она начинала заниматься чем-то другим, в этот момент было проблематично получить данные о нажатой клавише. Поэтому решил перенести код в поток, и это помогло.

Но появилась ещё одна проблема (и задача) - если нажимать клавиши очень быстро, то некоторые из них не улавливались моим кодом. Мне нужно было не упустить ни одного нажатия! Поэтому заменил GetKeyState на хук, и это решило проблему с пропуском нажатий, но вернуло первую проблему - если программа занята чем-то другим, хук не срабатывает.

И здесь мои навыки заканчиваются, я не могу сделать так, чтобы хук работал в потоке. Помогите мне решить две мои задачи :с

Вот код, на котором я остановился:
Код:
type
  TMyThread = class(TThread)
   protected
    procedure Execute; override;
   end;

procedure TMyThread.Execute;
 begin
  inherited;
  while True do
   begin
    //Код в потоке
   end;
 end;

var
 Thread1:TMyThread;

type
  PKBDLLHookStruct=^TKBDLLHookStruct;
  TKBDLLHookStruct = packed record
   vkCode,scanCode,flags,time:Cardinal;
   dwExtraInfo:PCardinal;
  end;

function HookProc(nCode,wParam,lParam:Integer):LRESULT; stdcall;
 begin
  if nCode=HC_ACTION then
   begin
    with PKBDLLHookStruct(lParam)^ do
     begin
      //Делаю что-то, когда нажалась клавиша vkCode
     end;
    end;
  Result:=CallNextHookEx(0,nCode,wParam,lParam);
 end;

var
 Hook:HHOOK;

<в начале запуска моей программы>
 Thread1:=TMyThread.Create(True);
 Thread1.FreeOnTerminate:=False;
 Thread1.Priority:=tpHighest;
 Thread1.Resume;
 Hook:=SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0);
ugorek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти USB клавиатуру по Vid/Pid. Nikolass44 Общие вопросы Delphi 1 15.09.2014 22:35
Реакция на клавиатуру ZaramothРещьфкфя Visual C++ 8 01.09.2012 15:01
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Хук на клавиатуру xshStasX Помощь студентам 1 09.08.2008 16:56
Хук (hook) на клавиатуру eoln Win Api 17 03.05.2008 18:35