IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Hooks api, несколько вопросов
сообщение
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Привет всем, опять это я и API _)

Нужно мне было сделать глобальную ловушку на мышь. Чтобы какое-то время нигде, кроме окошка моего приложения, клики не имели действия. Решил смастерить сам, залез в MSDN и начал читать про SetWindowhookEx с WH_MOUSE и далее по ссылкам. Я так понял, мне в качестве HookId нужно использовать WH_MOUSE_LL, низкоуровневый перехват, что ли. Сделал такую Callback-функцию:

Function pinrct(x,y:integer):boolean;
begin
if (x>=form1.left) and (x<=form1.left+form1.width) and (y>=form1.top) and (y<=form1.top+form1.height) then result:=true else result:=false;
end;

function LowLevelMouseProc(var code:integer;wparam:wparam;lparam:lparam):integer;stdcall;
var mousep:TPoint;
begin
mousep:=PMouseHookStruct(lparam)^.pt;
if code=HC_ACTION then begin
if ((wparam=WM_LBUTTONDOWN) or (wparam=WM_RBUTTONDOWN)) and not(pinrct(mousep.x,mousep.y)) then begin
end else postmessage(form1.handle,wparam,lparam,nil);
end;
// Result := CallNextHookEx(hook,Code,wparam,lparam);
end;
end;


Если я правильно перевёл, то если code будет равно HC_ACTION, то какое-то сообщение пришло. С PostMessage-параметрами там напутано, не пойму, какое сообщение слать, и на закомментированное присвоение Result-у ругается, на первый параметр. В msdn пишут, что он optional и вообще ignored. Я вот чего не пойму, почему везде пишут, что глобальные ловушки должны быть в dll; какая разница-то? И ещё, вот пришло сообщение в мой глобальный хук, если я не вызову настоящий обработчик оператором Inherited, то сообщение дальше не пойдёт?

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Кстати, если кому интересно, я тут заметил, что не всё подряд перехватывается smile.gif Например :

function LowLevelMouseProc(nCode: Integer; myWParam: WPARAM; myLParam: LPARAM): LRESULT; stdcall;
var
MHS: PMOUSEHOOKSTRUCT;
CR: TRect;
begin
CR := Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, Form1.Top + Form1.Height);
result := 1;
MHS := PMOUSEHOOKSTRUCT(myLParam);
if nCode = HC_ACTION then
begin
case myWParam of
WM_RBUTTONDOWN:exit;
end;
end;
result:=CallNextHookEx(MyHook, nCode, myWParam, myLParam);
end;


, позволяет кликнуть правой кнопкой на десктопе, чтобы появилось popup-меню. Наверное, его нельзя перехватывать. И ещё, если привязываться к координатам, то мышь всё равно будет работать, если чужое окно (или кусок того же popup-а) будет поверх моей формы smile.gif

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 15.05.2024 8:24
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name