Здравствуйте. Столкнулся с проблемой, которую я имею ни малейшего представления как её решить. Мне нужно было выполнить две задачи:
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?