Показать сообщение отдельно
  #1  
Старый 01.03.2019, 10:21
ugorek ugorek вне форума
Прохожий
 
Регистрация: 01.03.2019
Сообщения: 1
Версия Delphi: DelphiRADBerlin
Репутация: 10
Печаль Соединение воедино потока и хука на клавиатуру

Здравствуйте. Столкнулся с проблемой, которую я имею ни малейшего представления как её решить. Мне нужно было выполнить две задачи:

1. Получать данные о нажатой клавиши в любой момент;
2. И не упустить ни одного нажатия (когда клавиши нажимаются очень быстро).

С первой задачей хорошо справлялся дополнительный поток, но со второй у меня начались проблемы.
Ещё до второй задачи я использовал 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);

//Как сделать выполнение HookProc в TMyThread.Execute?
Ответить с цитированием