Загадки "левого хука".

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Загадки "левого хука".

Сообщение Alex2013 » 26.07.2020 17:00:00

1 Интересно, а зачем в виндовс глобальный хук обязательно нужно прятать в DLL? В линуксе все работает и без этого .
2 Пробовал использовать хук для замены клавиш .. ничего не вышло ! (нет, сделать то что было нужно я сделал, но через внешнюю надстройку в основной программе где проверял наличие срабатывания хука по таймеру и тут же эмулировал нажатие другой клавиши ) Так интересно можно ли просто подменить параметры при вызове CallNextHookEx(theHook, nCode, wParam, lParam);?
3 Где бы посмотреть формат lParam ?
Зы
Мой "типа Хук"...
Код: Выделить всё
library hook;

{$mode objfpc}{$H+}

uses
SysUtils,windows, messages ;
var
    theHook: THandle;  //хэндл ловушки для дальнейшего удаления
Const  F12_On:Boolean=false;

function MouseHook(nCode, wParam, lParam: integer): Lresult; stdcall;
begin
   if nCode < 0 then
  begin
    result := CallNextHookEx(theHook, nCode, wParam, lParam);
    exit;
  end;
    if (wParam = VK_F12 )  then
     begin
      F12_On:=True;
     end;
    result := CallNextHookEx(theHook, nCode, wParam, lParam); //дальше по цепочке
end;

//-------------------------------------------------------------------------

procedure Start;
begin
  theHook := SetWindowsHookEx(WH_KEYBOARD, @MouseHook, hInstance, 0); //установка ловушки
  if theHook = 0 then
    messageBox(0, 'Error!', 'Error!', mb_ok);
end;
//-------------------------------------------------------------------------
procedure Remove;
begin
  UnhookWindowsHookEx(theHook);   //удаление ловушки
end;

Function CheckedF12:boolean;export;
begin
Result:=F12_On;
  F12_On:=False;
end;
//-------------------------------------------------------------------------
{R *.res}

Exports

Start      index 1 name 'Start',
Remove     index 2 name 'Remove',
CheckedF12 index 3 name 'CheckedF12';

begin
end.
Alex2013
долгожитель
 
Сообщения: 1816
Зарегистрирован: 03.04.2013 11:59:44

Re: Загадки "левого хука".

Сообщение MysticCoder » 26.07.2020 17:32:43

1. эта длл загружается в адресное пространство всех процессов которым могут прийти сообщения ловимые хуком. при вызове первого хука или всех последующих по цепочке процесс в которые пришло перехватываемое сообщение эти хуки и исполняет, в своем адресном пространстве.
2. https://wasm.in/threads/podmena-nazhati ... ury.18326/ - тут говорят, что для подмены надо ставить хук на GetMessage, что, в общем то логично
3. https://docs.microsoft.com/en-us/window ... owshookexa - идешь сюда, ищешь нужный HookProc, в нем описание параметров.

Upd. у тебя в коде ошибка.

Код: Выделить всё
var
    theHook: THandle;  //хэндл ловушки для дальнейшего удаления
...
function MouseHook(nCode, wParam, lParam: integer): Lresult; stdcall;
begin
   if nCode < 0 then
  begin
    result := CallNextHookEx(theHook, nCode, wParam, lParam);
...


будет следующий прикол - дллка подгружается в другие процессы, и соответственно в них переменная theHook будет равна нулю, тогда CallNextHookEx(theHook, nCode, wParam, lParam); превращается в CallNextHookEx(0, nCode, wParam, lParam);, что очевидно не то, что ты хотел. т.е. работать то вроде будет, но другие хуки уже работать перестанут. у меня так глюки были, что в офисе после моего хука нажатия клавиш начинали работать очень странно.
theHook надо передавать как то через межпроцессное взаимодействия, общая память\файлы\сокеты или что то такое.
Последний раз редактировалось MysticCoder 26.07.2020 17:43:49, всего редактировалось 1 раз.
MysticCoder
постоялец
 
Сообщения: 150
Зарегистрирован: 14.09.2013 00:20:28

Re: Загадки "левого хука".

Сообщение Alex2013 » 26.07.2020 17:38:07

Ок. Спасибо, "буду посмотреть "! :idea:
Alex2013
долгожитель
 
Сообщения: 1816
Зарегистрирован: 03.04.2013 11:59:44

Re: Загадки "левого хука".

Сообщение Seenkao » 26.07.2020 22:02:01

Все эти "хуки" и прочее "низкоурвневое" (якобы) перестаёт работать, как только прямой опрос мыши (или любого другого устройства) начинаешь делать, и чтоб дальше не проходило, можно просто делать сброс и/или свою отметку о процессе, так же сбрасывая первоначальные данные пришедшие от мыши/устройства.
Seenkao
новенький
 
Сообщения: 40
Зарегистрирован: 01.04.2020 03:37:12

Re: Загадки "левого хука".

Сообщение serbod » 27.07.2020 09:08:57

http://drkb.shoutwiki.com/wiki/Interprocess_communication_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_keyboard_hook_(%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F)

Первая половина статьи содержит и описания параметров и примеры использования.
Аватара пользователя
serbod
постоялец
 
Сообщения: 447
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Загадки "левого хука".

Сообщение Alex2013 » 27.07.2020 12:31:02

Seenkao писал(а):Все эти "хуки" и прочее "низкоурвневое" (якобы) перестаёт работать, как только прямой опрос мыши (или любого другого устройства) начинаешь делать, и чтоб дальше не проходило, можно просто делать сброс и/или свою отметку о процессе, так же сбрасывая первоначальные данные пришедшие от мыши/устройства.

"Прямой опрос" это через прот ? Ну в моем случае это фиолетово я просто узнаю, что была нажата клавиша и эмулирую нажатие другой .
Разумеется проще было бы подменить данные прямо внутри хука. Но у меня "глобальный хук поверх глобального хука" так что фиг его знает где там цепочка начинается и заканчивается .

Добавлено спустя 1 минуту 1 секунду:
serbod писал(а):http://drkb.shoutwiki.com/wiki/Interprocess_communication_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_keyboard_hook_(%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F)

Первая половина статьи содержит и описания параметров и примеры использования.

Спасибо !
Alex2013
долгожитель
 
Сообщения: 1816
Зарегистрирован: 03.04.2013 11:59:44

Re: Загадки "левого хука".

Сообщение Seenkao » 27.07.2020 22:20:05

WinAPI, вылавливаешь первоначальный процесс и "обнуляешь" его, а для себя делаешь пометку, что событие произошло.
Хуки не самые низкие, есть ещё ниже, от основного окна Windows.
Seenkao
новенький
 
Сообщения: 40
Зарегистрирован: 01.04.2020 03:37:12

Re: Загадки "левого хука".

Сообщение Alex2013 » 29.07.2020 14:32:55

MysticCoder писал(а):Upd. у тебя в коде ошибка.

Хм ! Надо подумать ... Хотя этот кусок

Код: Выделить всё
if nCode < 0 then
  begin
    result := CallNextHookEx(theHook, nCode, wParam, lParam);
    exit;
  end;

...считается как бы стандартным. :arrow: https://clck.ru/PwiQk :arrow: https://forum.vingrad.ru/forum/topic-236052.html
Alex2013
долгожитель
 
Сообщения: 1816
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru