Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
1

Проблемы с хуком WH_KEYBOARD_LL + PeekMessage/GetMessage

02.03.2019, 17:55. Показов 1715. Ответов 7
Метки hook (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята здарова!
выручайте) весь уже измучился =( не получается =(

Тема такая, работаю с хуком, использую WH_KEYBOARD_LL
тк нужно работать и с 32 битной и 64 битной разрядностью.
и вообще мне нравится с ним работать всё очень просто и удобно но появилось одно НО =(

WH_KEYBOARD_LL работает до добавления сообщения в очередь в контексте потока.

и это действительно так =(

дело в том что я через хук ловлю введённую информацию и потом обрабатываю это через
idHTTP (ищу в интернете ответ)... если сигнал хороший то всё круть... а когда связь не очень..
и происходят небольшие задержки..
как я понимаю в WH_KEYBOARD_LL складируются результаты которые он не может передать
и затем хук выбивается... тоесть чтобы всё вновь заработало нужно сделать так

Delphi
1
KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0);
и хук по прежнему работает до тех пор пока не вылетит вновь.

Чтобы решить эту проблему как я понял нужно использовать PeekMessage или GetMessage
и удалять излишки... Но в сети очень мало информации о том как ими пользоваться я не понимаю
куда и как их вставлять.
Я делал вот так... писал в ДЛЛке
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
// типа если есть излишки выходи
так же вставлял там это:
Delphi
1
2
3
4
5
    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
    begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
но не помогает =(

Может это где-то в ЕХЕшнике нужно вставлять? я не понимаю как с ним работать =(
Может кто на форуме знает? помогите пожалуйста ответом
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2019, 17:55
Ответы с готовыми решениями:

Проблемы с peekmessage
Если я поставлю в peekmessage pm_remove то сообщения WM_ не будут рабртать? Если я ошибаюсь то...

Lazarus не знает что такое WH_KEYBOARD_LL
собственно сабж в чем проблема

WH_KEYBOARD_LL Хук, русские буквы из чужого окна
Всем привет! Перехватываю нажатия клавиш... но к сожалению не получается перехватить буквы с...

Qt PeekMessage цикл
Как можно встроить в программу на Qt цикл с обработкой сообщений конкретному окну, а всё остальное...

7
Модератор
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
Цитата Сообщение от x-help Посмотреть сообщение
было бы хорошо чтоб использовался Send
Повторю вопрос:
Цитата Сообщение от FIL Посмотреть сообщение
Что мешает своевременно обработать сообщение?
Раздели прием сообщений и их обработку.
0
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
03.03.2019, 17:58  [ТС] 5
Цитата Сообщение от FIL Посмотреть сообщение
Раздели прием сообщений и их обработку.
простите я что то не врубаюсь =( что вы имеете ввиду?

Добавлено через 13 минут
можно примерчик как его в exe встраивать?

Добавлено через 17 минут
просто я делал вот так... не работает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
const
  KeyboardEvent=WM_USER+557;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
 
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  function KeyboardHook(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  end;
 
 type
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: DWORD;
  end;
  PBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
 
var
  Form1: TForm1;
   KeyboardHandle: HHOOK;
implementation
 
{$R *.dfm}
 
function tform1.KeyboardHook(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
msg:TMsg;
begin
 
 if code>=0 then
  begin
    if (wParam=WM_KEYDOWN) then
    begin
 
      memo1.Text:=PBDLLHOOKSTRUCT(lParam).vkCode.ToString;
 
    end;
  end;
  Result:=CallNextHookEx(KeyboardHandle, code, wParam, lParam)
 
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @tform1.KeyboardHook, HInstance, 0);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 if KeyboardHandle<>0 then UnhookWindowsHookEx(KeyboardHandle);
end;
Добавлено через 11 минут
ой всё получилось сделать... просто я функцию KeyboardHook в form1 загнал...
сейчас попробую так обрабатывать..хех

Добавлено через 3 минуты
или вы вообще не про это говорили?)

Добавлено через 55 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 if code>=0 then
  begin
    if (wParam=WM_KEYDOWN) then
    begin
 
      {тут обрабатываю PBDLLHOOKSTRUCT(lParam).vkCode;
       и посылаю на idHTTP, жду от него ответ...
       если связь плохая спустя ~6 попыток то всё обрубается =( и этот поток больше не работает...
       чтобы всё заработало нужно опять сделать:
       KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0);
       }
 
 
    end;
  end;
  Result:=CallNextHookEx(KeyboardHandle, code, wParam, lParam)
пробовал сделать
Delphi
1
2
3
4
5
try 
//обработка
except
   KeyboardHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0);
end;
но в экцепт не попадает когда слетает =(

а как вообще узнать что он слетел?
думал вот так
if KeyboardHandle=0 then ...
но нет =( 0-ём он не становится =(
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
03.03.2019, 18:50 6
Цитата Сообщение от x-help Посмотреть сообщение
что вы имеете ввиду?
Я имею в виду, что 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2019, 15:04
Помогаю со студенческими работами здесь

Поток с GetMessage
Привет всем. У меня в программе в отдельном потоке имеется такой код: while(GetMessage(&amp;msg,0,0,0)...

Проблема с хуком
Подскажите в чем проблема и как это можно решить? Создал хук на события мыши и некоторых клавиш,...

Прoблемa с хуком
Всем привет! Делаю прогу повторяющую действия, хочу сделать на воспроизведении действий...

PeekMessage не работает должным образом
#include&lt;windows.h&gt; #include &lt;iostream&gt; HHOOK _hook; HINSTANCE hinstDLL; int a; LRESULT...

Работа с глобальным хуком
Сабж. Знаю, в инете полно, какой рабочий, т.е. каким вы пользовались и у вас получилось? п.с....

Qt+WinAPI. Бесконечный GetMessage
Пишу программу, потребовалось глоабльно перехватывать клавиши. Пытался использовать qxt, но под qt...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru