wader Это все понятно. Но пойми, что у меня в руках, только TMOUSEHOOKSTRUCT, и через него я не могу выйти на MOUSEHOOKSTRUCTEX, чтобы добраться до маусдата. Это главная проблема
Добавлено: Я практически добрался вручную до этого mousedata. Смотри:
type
MOUSEHOOKSTRUCTEX = packed record
mhs: TMOUSEHOOKSTRUCT;
mouseData: DWORD;
end;
function GlobalMouseHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
ex: MOUSEHOOKSTRUCTEX;
begin
if code <> HC_ACTION then begin
GlobalMouseHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if Wparam = WM_MOUSEWHEEL then begin
ex.mhs := TmouseHookStruct(Pointer(lparam)^);
ex.mousedata := dword(Pointer(lparam+sizeof(TMOUSEHOOKSTRUCT))^);
showmessage(int2str(HIWORD(ex.mouseData)));
end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
GlobalMouseHook:=0;
Exit
end;
Положительные значения при движении вверх получаются отлично (120, 240, 360 и т.д.), а вот отрицательные нет.
Видимо, что до нужно дополнить. Помогите
Добавлено: При движении вниз получаю значения: 64576, 65176, 65296 ...
Совсем не то. Вспоминаю теорию (архитектура ЭВМ). Перевожу эти числа в двоичную с. исч.:
64576 = 1111 1100 0100 0000
65176 = 1111 1110 1001 1000
65296 = 1111 1111 0001 0000
Перевожу их в дополнительный код (заменяю 0 на 1 а 1 на 0)
1111 1100 0100 0000 = 1110111111
1111 1110 1001 1000 = 101100111
1111 1111 0001 0000 = 11101111
И увеличиваю младший бит на 1
1110111111 = 1111000000
101100111 = 101101000
11101111 = 11110000
и смотрю что у меня получилось:
1111000000 = 960
101101000 = 360
11110000 = 240
Это уже отрицательные значения. И видно, что они правильные, т.к. кратны 120.
Это что выходит, что hiword правильно выдает только положительные числа. А чтоб получить отрицательное, нужно проделывать вышеописанные
действия (кстати, на то, что число отрицательное указывает единица в самом старшем бите). Думаю, что в Delphi есть процедура, которая
делает это (65296 -> -240). Профи, подскажите!
Добавлено: Все получилось! Вот рабочая функция (по крайней мере, на моем компе):
type
MOUSEHOOKSTRUCTEX = packed record
mhs: TMOUSEHOOKSTRUCT;
mouseData: DWORD;
end;
function GlobalMouseHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
i: integer;
s: string;
ex: MOUSEHOOKSTRUCTEX;
begin
if code <> HC_ACTION then begin
GlobalMouseHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if Wparam = WM_MOUSEWHEEL then begin
ex.mhs := TmouseHookStruct(Pointer(lparam)^);
ex.mousedata := dword(Pointer(lparam+sizeof(TMOUSEHOOKSTRUCT))^);
i := smallint(HIWORD(ex.mouseData)) div wheel_delta;
s := int2str(abs(i))+' оборот(а,ов) ';
if i>0 then s := s + 'вверх' else
s := s + 'вниз';
showmessage(s);
end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
GlobalMouseHook:=0;
Exit;
end;
P.S. Странно, что ни MOUSEHOOKSTRUCTEX, ни как до него добраться в Delphi не описано, хотя мб я плохо искал
P.P.S. Спасибо всем, кто помог
P.P.P.S. У кого win 2000 и мышь с колесом, проверьте код на работоспособность