0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
|
||||||||||||||||
1 | ||||||||||||||||
Проблемы с хуком WH_KEYBOARD_LL + PeekMessage/GetMessage02.03.2019, 17:55. Показов 1715. Ответов 7
Ребята здарова!
выручайте) весь уже измучился =( не получается =( Тема такая, работаю с хуком, использую WH_KEYBOARD_LL тк нужно работать и с 32 битной и 64 битной разрядностью. и вообще мне нравится с ним работать всё очень просто и удобно но появилось одно НО =( WH_KEYBOARD_LL работает до добавления сообщения в очередь в контексте потока. и это действительно так =( дело в том что я через хук ловлю введённую информацию и потом обрабатываю это через idHTTP (ищу в интернете ответ)... если сигнал хороший то всё круть... а когда связь не очень.. и происходят небольшие задержки.. как я понимаю в WH_KEYBOARD_LL складируются результаты которые он не может передать и затем хук выбивается... тоесть чтобы всё вновь заработало нужно сделать так
Чтобы решить эту проблему как я понял нужно использовать PeekMessage или GetMessage и удалять излишки... Но в сети очень мало информации о том как ими пользоваться я не понимаю куда и как их вставлять. Я делал вот так... писал в ДЛЛке
Может это где-то в ЕХЕшнике нужно вставлять? я не понимаю как с ним работать =( Может кто на форуме знает? помогите пожалуйста ответом
0
|
02.03.2019, 17:55 | |
Ответы с готовыми решениями:
7
Проблемы с peekmessage Lazarus не знает что такое WH_KEYBOARD_LL WH_KEYBOARD_LL Хук, русские буквы из чужого окна Qt PeekMessage цикл |
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
|
|
03.03.2019, 11:18 | 2 |
Для WH_KEYBOARD_LL не нужна ДЛЛ.
Что мешает своевременно обработать сообщение? Добавлено через 5 минут Можно попробовать PostMessage вместо SendMessage.
0
|
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
|
|
03.03.2019, 14:31 [ТС] | 3 |
разве если я сделаю это в ехе-шнике это как-то поможет проблеме? сообщения ведь так же и будут складироваться по таким же принципам =(
попробовал вот так PostMessage(FindWindow('TForm1', 'Form1'), KeyboardEvent, PBDLLHOOKSTRUCT(lParam).vkCode, 0); тоже не помогает.. сабжы вообще не доходят... а его как правильно считывать через msg.LParam? Добавлено через 10 минут и вот так PostMessage(FindWindow('TForm1', 'Form1'),WM_KEYDOWN ,KeyboardEvent, PBDLLHOOKSTRUCT(lParam).vkCode ); Добавлено через 47 минут вух с PostMessage сработало перестало выбивать хук) спасибо и действительно Post же только отправляет не дожидается ответа... как я сам не допёр) но вопрос всё равно открытый тк с постом прога ведёт себя плохо и показывает всякие странности =( было бы хорошо чтоб использовался Send а только при плохом соединении если избыток сообщений они отчищались так что если кто то знает как правильно использовать PeekMessage или GetMessage отпишитесь плз!
0
|
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
|
|
03.03.2019, 15:20 | 4 |
0
|
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
|
||||||||||||||||
03.03.2019, 17:58 [ТС] | 5 | |||||||||||||||
простите я что то не врубаюсь =( что вы имеете ввиду?
Добавлено через 13 минут можно примерчик как его в exe встраивать? Добавлено через 17 минут просто я делал вот так... не работает
ой всё получилось сделать... просто я функцию KeyboardHook в form1 загнал... сейчас попробую так обрабатывать..хех Добавлено через 3 минуты или вы вообще не про это говорили?) Добавлено через 55 минут
а как вообще узнать что он слетел? думал вот так if KeyboardHandle=0 then ... но нет =( 0-ём он не становится =(
0
|
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
|
|
03.03.2019, 18:50 | 6 |
Я имею в виду, что KeyboardHook должна только принимать коды нажатых клавиш и добавлять их, например, в какой нибудь буфер. Никаких idHTTP!
А обработку принятых кодов делать уже в другом месте. Например по таймеру или из KeyboardHook слать PostMessage, сигнализирующий о том, что получены данные, требующие обработки. Или вообще отдельный поток запускать.
0
|
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
|
|
03.03.2019, 19:24 [ТС] | 7 |
да пробовал в отдельном потоке но получается то же самое что и с postmessage... дело в том что всё равно нужна синхронизация тк ответ приходит когда он получен от idHTTP... без этого в программе идут расхождения и получается килеберда.. подскажите пожалуйста а как узнать что
KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0); - слетел? я думал что хендл должен стать 0 но он не меняется =( также я писал в основной функции lastError:=GetLastError; но после того как она слетает lastError так и остаётся 0 =( вот как получить код этой моей ошибки??? =(
0
|
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
|
|
04.03.2019, 15:04 [ТС] | 8 |
Вот кстати форумчанин пишет об этом... он как то решил проблему с лимитом
но я не понимаю как... потому что там всё на Си может кто то сможет перевести? =( Добавлено через 6 секунд Как перехватить, и изменить сообщение клавиатуры
0
|
04.03.2019, 15:04 | |
04.03.2019, 15:04 | |
Помогаю со студенческими работами здесь
8
Поток с GetMessage Проблема с хуком Прoблемa с хуком PeekMessage не работает должным образом Работа с глобальным хуком Qt+WinAPI. Бесконечный GetMessage Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |