Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перехватить событие MouseWheelUp\MouseWheelDown [D7, XP]


HF-Trade ©   (2006-02-17 12:21:00) 

Здравствуйте Господа, Такой вопросик -
Есть такая функция
GetAsyncKeyState
С помощью нее можно узнать была ли нажата конпка мыши\клавиатуры.
А как узнать что было событие колесика =)
В НЕ ОБЛАСТИ ФОРМЫ.


begin...end   (2006-02-17 16:28:00) [1]

> HF-Trade ©   (17.02.06 12:57) [5]

> А можно пример WH_MOUSE_LL (для ХР, без ДЛЛ).

const
 WH_MOUSE_LL = 14;
var
 H: HHOOK;

function HookProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
type
 PMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
 MSLLHOOKSTRUCT = packed record
   pt: TPoint;
   mouseData: Cardinal;
   flags: Cardinal;
   time: Cardinal;
   dwExtraInfo: DWORD;
 end;
const
 Fmt = 'CursorX = %d CursorY = %d WheelDelta = %d';
begin
 if (code = HC_ACTION) and (wparam = WM_MOUSEWHEEL) then
   with PMSLLHOOKSTRUCT(lparam)^ do
     MessageBox(0,
                PChar(Format(Fmt, [pt.X, pt.Y, SmallInt(HiWord(mouseData)) div WHEEL_DELTA])),
                'WM_MOUSEWHEEL',
                0);
 Result := CallNextHookEx(0, code, wparam, lparam)
end;

begin
 H := SetWindowsHookEx(WH_MOUSE_LL, HookProc, HInstance, 0)
end.


КаПиБаРа   (2006-02-17 14:19:00) [2]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=548


HF-Trade   (2006-02-17 13:28:00) [3]

Да дал я ему на тест - говорит кнопка для снятия хука вообще не нажимается.
Через раз все виснет...
Вот код -

Var
 HookHandle: hHook;
implementation

{$R *.dfm}

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
 msg: PEVENTMSG;
begin
 if Code >= 0 then begin
   result := 0;
   msg := Pointer(LParam);
   with Form1 do
     case msg.message of

       WM_MBUTTONDOWN:
       CheckBox3.Checked:=True;

       WM_MBUTTONUP:
       CheckBox3.Checked:=False;

       WM_LBUTTONDOWN:
       CheckBox1.Checked:=True;

       WM_LBUTTONUP:
       CheckBox1.Checked:=False;

        WM_RBUTTONDOWN:
        CheckBox2.Checked:=True;
 
       WM_RBUTTONUP:
       CheckBox2.Checked:=False;

     end;
 end

 else
   Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(HookHandle);
end;


КаПиБаРа   (2006-02-17 13:16:00) [4]

HF-Trade ©   (17.02.06 12:57) [5]
Попробуй у него запустить простую тестовую программу с хуком, которая подсчитывает количество нажатий на кнопку мыши и выводит на форму.
Если будет работать, то причина зависания в твоей программе. Если тоже будет виснуть выкладывай сюда код.


HF-Trade   (2006-02-17 12:57:00) [5]

Все дело в том что если с хуком то у при нажатии на колесико(как на среднюю кнопку) у человека виснет все намертво.))) Я не знаю почему=)  У меня все норм. Помимо этого дальнейший обработчик эмулирует пару кликов мыши с задержками и ее перемещение, вообщем чтоб работало ПРАВИЛЬНО - приходится снимать хук в начале обработчика, а в конце его снова ставить. Проверял иначе на секунду подвисает окно в котором эмулируется клик.

> begin...end ©  

А можно пример WH_MOUSE_LL (для ХР, без ДЛЛ).


КаПиБаРа   (2006-02-17 12:49:00) [6]

HF-Trade ©   (17.02.06 12:41) [2]
Вообщет лучше без хука, я в таймер загнал


В таймер...
это методологически неверно. Делай через хук, что бы потом не переписывать.


begin...end   (2006-02-17 12:48:00) [7]

> HF-Trade ©   (17.02.06 12:41) [2]

Функции: SetWindowsHookEx/CallNextHookEx/UnhookWindowsHookEx.

Тип хука: WH_MOUSE_LL (не требует создания DLL, но возможен только для NT-систем) или WH_MOUSE (требует создания DLL, но работает как в NT, так и в 9x).

Примеры есть в интернете.

> Вообщет лучше без хука, я в таймер загнал

Вообще-то, лучше с хуком. Потому что тогда таймер будет не нужен, и Ваша процедура ловушки будет вызываться именно тогда, когда нужно -- при нажатии кнопок мыши (WM_LBUTTONDOWN/WM_RBUTTONDOWN/...) или при прокрутке колеса (WM_MOUSEWHEEL).


HF-Trade   (2006-02-17 12:41:00) [8]

Да пофигу как)))
Сама функция какая?)
(Вообщет лучше без хука, я в таймер загнал).


begin...end   (2006-02-17 12:27:00) [9]

Хук?


Наверх

Титульная страница Поиск, карта сайта Написать письмо