Вверх ↑
Этот топик читают: Гость
Ответов: 1925
Рейтинг: 172
#1: 2016-02-12 13:37:37 ЛС | профиль | цитата
Была тема (http://forum.hiasm.net/forum.html?q=3&p=200459) про перехват клавиатуры, ну а мне нужно было перехватить боковые кнопки мыши. Установил hook, а он перехватывает все события мыши в системе. Так что выкладываю для нуждающихся:

Add(MainForm,2953706,105,105)
{
Position=1
Point(Handle)
link(onCreate,15561254:doPopup,[])
}
Add(InlineCode,12360657,252,343)
{
@Hint=#24:Глобальный перехват мыши|
EventPoints=#2:ev|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|17: ev:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|30: str := Int2Str(w)+Int2Str(d);|25: _hi_OnEvent(hac.ev,str);|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.|
link(ev,14423304:doAdd,[])
}
Add(Memo,14423304,308,343)
{
Left=10
Top=5
Width=160
Height=260
AddType=1
ScrollBars=2
}
Add(InfoTip,13344029,238,140)
{
Info=#20:5120 - движение мыши|55:522ХХХ - прокрутка колеса, где ХХХ - значение прокрутки|18:5130 - нажатие ЛКМ|21:5140 - отпускание ЛКМ|18:5160 - нажатие ПКМ|21:5170 - отпускание ПКМ|21:5190 - нажатие колеса|24:5200 - отпускание колеса|33:5231 - нажатие 1-й боковой кнопки|36:5241 - отпускание 1-й боковой кнопки|33:5232 - нажатие 2-й боковой кнопки|35:5242 - отпускание 2-й боковй кнопки|
Frame=2
Transparent=1
HAlign=0
Width=316
Height=172
Margin=5
}
Add(WinTools,15561254,154,112)
{
link(Handle,2953706:Handle,[(160,100)(136,100)(136,149)(111,149)])
}
Расшифровка значений прилагается.

Проверьте, пожалуйста и отпишитесь, работает ли на Win7/8, верна ли расшифровка значений.
карма: 9
4
Голосовали:Rysik, wasya, Konst, Joiner
vip
#1.1контекстная реклама от партнеров
Ответов: 8888
Рейтинг: 823
#2: 2016-02-12 14:49:12 ЛС | профиль | цитата
3042, Win-7, 64-разрядов, нормально:
НооkМыши.jpg
карма: 19

0
файлы: 1НооkМыши.jpg [67.5KB] [1530]
Ответов: 39
Рейтинг: 2
#3: 2016-02-14 12:18:04 ЛС | профиль | цитата
3042 писал(а):
Win7/8

Win8 32, Win7 32 нормально но у меня на мыше 5 доп. кнопок(media(next,play/pause,prev),volume(+,-)) можно ли больше 2 доп. кнопок перехватить??
а можно перехватить и не передавать в систему??
карма: 1

0
Ответов: 223
Рейтинг: 24
#4: 2016-02-14 12:36:23 ЛС | профиль | цитата
Win7 64 - работает...
карма: 0

0
Ответов: 1925
Рейтинг: 172
#5: 2016-02-15 09:48:33 ЛС | профиль | цитата
RAWY, а IC что-то выдаёт на эти кнопки (media(next,play/pause,prev),volume(+,-))?
------------ Дoбавленo в 09.48:
RAWY писал(а):
а можно перехватить и не передавать в систему??

Это надо поиграться с CallNextHookEx в коде. Обычно если CallNextHookEx нет, то остальным ловушкам системы ничего и не передаётся. Впрочем, гарантии нет, см. https://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx
карма: 9
0
Ответов: 39
Рейтинг: 2
#6: 2016-02-15 18:46:18 ЛС | профиль | цитата
3042, от начала 5231, и к 5235 нажатие и 5241 и к 5245 нажатие.
Только вот у меня прокрутка колеса у меня в одну сторону 522120, а обратно 52265416 это так и надо?? Или же надо 52265656???
карма: 1

0
Ответов: 8888
Рейтинг: 823
#7: 2016-02-15 22:22:30 ЛС | профиль | цитата
RAWY, 65416 -- это неправильное отображение двухбайтной знаковой целой (65416-65536=-120) с помощью двухбайтной же, но без знаковой целой
карма: 19

0
Ответов: 1925
Рейтинг: 172
#8: 2016-02-17 19:05:07 ЛС | профиль | цитата
Верно, Леонид. Я хотел, чтобы выдавало правильно: +120 и -120, но так и не понял, какого типа должна быть mouseData в tagMSLLHOOKSTRUCT (dword - это, видимо, для С++). Я ставил и знаковый Integer и пр., но бестолку.

RAWY писал(а):
от начала 5231, и к 5235 нажатие и 5241 и к 5245 нажатие отпускание?

Ну, вот по этим значениям и различай нажатые кнопки. Всё определяется экспериментально!
------------ Дoбавленo в 19.05:
Вообще, 523 - это нажатие доп. кнопки, а 524 - отпускание. Четвёртая цифра как раз и указывает, какая именно кнопка нажата.
карма: 9
0
Ответов: 8888
Рейтинг: 823
#9: 2016-02-17 19:43:18 ЛС | профиль | цитата
3042, тип двухбайтовой знаковой целой "smallint", у нас применена в BASS и IC
карма: 19

0
Ответов: 1925
Рейтинг: 172
#10: 2016-02-18 12:21:16 ЛС | профиль | цитата
Леонид, пробовал и smallint, и другие порядковые - бестолку (на smallint просто 0 выдаёт на колесо в любой ситуации).
карма: 9
0
Ответов: 4622
Рейтинг: 746
#11: 2016-02-18 12:49:13 ЛС | профиль | цитата
Типом данных не решается - нужна функция Int2Str для 2-байтового знакового целого.
Делай так:

#pas
function hook(code,w,l:integer):Lresult; stdcall;
var str:string;
ll:tagMSLLHOOKSTRUCT;
d: LongWord;
begin
ll := tagMSLLHOOKSTRUCT(pointer(l)^);

d := ll.mouseData shr 16;
if d and $8000 <> 0 then d := d or $FFFF0000;

str := Int2Str(w)+Int2Str(d);
_hi_OnEvent(hac.ev,str);
result := CallNextHookEx(H,code,w,l);
end;
карма: 26

1
Голосовали:3042
Ответов: 1925
Рейтинг: 172
#12: 2016-02-18 17:06:49 ЛС | профиль | цитата
Обновил в первом посте.
карма: 9
0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)