|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Соединение воедино потока и хука на клавиатуру
Здравствуйте. Столкнулся с проблемой, которую я имею ни малейшего представления как её решить. Мне нужно было выполнить две задачи:
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? |