|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблемы с хуком WH_KEYBOARD_LL + PeekMessage/GetMessage
Ребята здарова!
выручайте) весь уже измучился =( не получается =( Тема такая, работаю с хуком, использую WH_KEYBOARD_LL тк нужно работать и с 32 битной и 64 битной разрядностью. и вообще мне нравится с ним работать всё очень просто и удобно но появилось одно НО =( WH_KEYBOARD_LL работает до добавления сообщения в очередь в контексте потока. и это действительно так =( дело в том что я через хук ловлю введённую информацию и потом обрабатываю это через idHTTP (ищу в интернете ответ)... если сигнал хороший то всё круть... а когда связь не очень.. и происходят небольшие задержки.. как я понимаю в WH_KEYBOARD_LL складируются результаты которые он не может передать и затем хук выбивается... тоесть чтобы всё вновь заработало нужно сделать так KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0); и хук по прежнему работает до тех пор пока не вылетит вновь. Чтобы решить эту проблему как я понял нужно использовать PeekMessage или GetMessage и удалять излишки... Но в сети очень мало информации о том как ими пользоваться я не понимаю куда и как их вставлять. Я делал вот так... писал в ДЛЛке Код:
function KeyboardHook(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var msg:TMsg; begin if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then exit; if code>=0 then begin if (wParam=WM_KEYDOWN) then begin SendMessage(FindWindow('TForm1', 'Form1'), KeyboardEvent, 0,PBDLLHOOKSTRUCT(lParam).vkCode); end; end; Result:=CallNextHookEx(KeyboardHandle, code, wParam, lParam) end; // if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then exit; // типа если есть излишки выходи так же вставлял там это: while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; но не помогает =( Может это где-то в ЕХЕшнике нужно вставлять? я не понимаю как с ним работать =( Может кто на форуме знает? помогите пожалуйста ответом Последний раз редактировалось Admin, 03.03.2019 в 13:18. |
#2
|
|||
|
|||
Да, SendMessage ждет пока произойдет обработка сообщения и вернется результат. Более того, если использовать PostMessage, который не ждет ответа, но ты его ждешь вручную, то результат будет тем же.
Как вариант, создать свою очередь для сообщений. Из хука просто сохранять туда сообщение, а отдельный поток вычитывает сообщения оттуда и делает обработку. Но, соответсвенно, надо будет писать свой возврат результата и, соотв., скорректировать его с текущим вводом пользователя. |