Jokerjar
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 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 и мышь с колесом, проверьте код на работоспособность |