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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter