Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.167.196] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. У меня была задача получать данные о нажатой клавиши в любой момент, и изначально я использовал 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); |
Сообщ.
#2
,
|
|
|
вынесите вычисление в поток и будет вам щастие
|
Сообщ.
#3
,
|
|
|
Чта? Какое вычисление? Ты о чём?
|