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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.03.2019, 17:51
electrichesky electrichesky вне форума
Прохожий
 
Регистрация: 01.10.2013
Сообщения: 8
Версия Delphi: Delphi XE2
Репутация: 10
По умолчанию Проблемы с хуком 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  
Старый 05.03.2019, 01:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, SendMessage ждет пока произойдет обработка сообщения и вернется результат. Более того, если использовать PostMessage, который не ждет ответа, но ты его ждешь вручную, то результат будет тем же.

Как вариант, создать свою очередь для сообщений. Из хука просто сохранять туда сообщение, а отдельный поток вычитывает сообщения оттуда и делает обработку. Но, соответсвенно, надо будет писать свой возврат результата и, соотв., скорректировать его с текущим вводом пользователя.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter