Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 00:33   #1
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
Вопрос Хук на систему

Всем привет! В нижеприведённом коде я устанавливаю хук на систему и отлавливаю в нём сообщения, что ролик мыши крутится. И тут вопрос, как узнать в какую именно сторону вращается ролик? Вверх или вниз? Т.к. на обе стороны вращения одно сообщение WM_MOUSEWHEEL...
Код:
Var
HookHandle: HHook;
Function HookProc(Code: Integer; WParam: Word; LParam: Longint): Longint; Stdcall;
Var
Msg: PEVENTMSG;
Begin
If Code>=0 Then
Begin
Msg:=Pointer(LParam);
Case Msg.message Of
WM_MOUSEWHEEL: Form1.Memo1.Lines.Add('Mouse');
End;
End;
End;
Procedure TForm1.FormCreate(Sender: TObject);
Begin
HookHandle:=SetWindowsHookEx(WH_JOURNALRECORD,@HookProc,HInstance,0);
End;
Procedure TForm1.FormDestroy(Sender: TObject);
Begin
If HookHandle<>0 Then
UnhookWindowsHookEx(HookHandle);
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 17.03.2009, 00:43   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Из хэлпа:
Цитата:
WM_MOUSEWHEEL
fwKeys = LOWORD(wParam); // key flags
zDelta = (short) HIWORD(wParam); // wheel rotation
xPos = (short) LOWORD(lParam); // horizontal position of pointer
yPos = (short) HIWORD(lParam); // vertical position of pointer
Вывод - нужно следить за yPos...
mihali4 вне форума Ответить с цитированием
Старый 17.03.2009, 01:20   #3
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Поясните пожалуйста поподробнее... Как в моём случае поступить? Я следил за yPos как вы говорили, когда локально для формы отлавливал сообщение, а тут я пробовал различные варианты и что то у меня ничего не вышло.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 20.03.2009, 18:29   #4
Strogg
Пользователь
 
Аватар для Strogg
 
Регистрация: 19.03.2009
Сообщений: 13
По умолчанию

Если сохранять уПоз через небольшие промежутки времени, то можно узнать что и куда вращалось.
Strogg вне форума Ответить с цитированием
Старый 20.03.2009, 19:19   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Можно даже не сохранять, а сразу на проверку ставить. У меня получается, что когда я ловлю сообщение для формы, то всё хорошо работает и всё легко могу распознать, а когда глобально пытаюсь словить, то у меня вылазит целая куча значений и они повторяются т.е. одни одинаковы, а раз они одинаковы, то я не могу сориентироваться. В общем всё работает кроме того что надо.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 20.03.2009, 21:28   #6
Феска
Пользователь
 
Регистрация: 16.11.2007
Сообщений: 20
По умолчанию

Цитата:
zDelta = (short) HIWORD(wParam); // wheel rotation
если дельта больше 0, то крутиться в одну сторону , если меньше в другую , если ноль то не знаю, наверно,прилетели инопланетяне.
Феска вне форума Ответить с цитированием
Старый 21.03.2009, 00:42   #7
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Я такой вариант пробовал. Самое прикольное, что у меня постоянно 0 получается, что бы я не делал.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 27.03.2009, 21:19   #8
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Наконец-то разобрался со своей проблемой. Выкладываю очень хороший код, может кому то и пригодится.
Код:
Private
    { Private declarations }
    Procedure WMUser(Var Message: TMessage); Message WM_USER;
...
Var
HMouseHook: HHOOK;
Type
TagMSLLHOOKSTRUCT = Packed Record
Pt: TPoint;
MouseData: DWord;
Flags: DWord;
Time: DWord;
DwExtraInfo: PDWord;
End;
TMSLLHOOKSTRUCT  = TagMSLLHOOKSTRUCT;
PMSLLHOOKSTRUCT = ^ TMSLLHOOKSTRUCT;
Function LowLevelMouseProc(nCode: Integer; WParam: WPARAM;
LParam: PMSLLHOOKSTRUCT): LRESULT; Stdcall;
Begin
Result := CallNextHookEx(HMouseHook, NCode, WParam, DWORD(LParam));
If nCode < 0 Then
Exit;
If nCode In [HC_ACTION, HC_NOREMOVE] Then
If WParam = WM_MOUSEWHEEL Then
PostMessage(Form1.Handle, WM_USER, Integer(LParam^.mouseData), 0);
End;
Procedure TForm1.FormCreate(Sender: TObject);
Const
WH_MOUSE_LL = 14;
Begin
HMouseHook:=SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, HInstance, 0);
End;
Procedure TForm1.WMUser(Var Message: TMessage);
Const
UD_MAXVAL = $7fff;
UD_MINVAL = -UD_MAXVAL;
Var
KeyState: TKeyboardState;
Begin
With Message Do
Begin
GetKeyboardState(KeyState);
If KeyState[VK_SHIFT] Shr 7 = 0 Then
Begin
If WParamHi < UD_MAXVAL Then
Caption:='Прокрутка вверх'
Else
Caption:='Прокрутка вниз';
End
Else
Begin // с нажатым Shift в офисе прокрутка осуществляется по горизонтали
If WParamHi < UD_MAXVAL Then
Caption := 'Прокрутка вправо'
Else
Caption := 'Прокрутка влево';
End;
End;
End;
Всем большое спасибо за помощь!!!
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук на клавиатуру xshStasX Помощь студентам 1 09.08.2008 16:56
локальный хук vitalik007 Win Api 3 16.05.2008 09:08
Хук (hook) на клавиатуру eoln Win Api 17 03.05.2008 18:35
хук rpy3uH Win Api 0 30.10.2006 20:47