Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Как перехватить событие MouseWheelUp MouseWheelDown   Найти похожие ветки 

 
HF-Trade ©   (2006-02-17 12:21) [0]

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


 
begin...end ©   (2006-02-17 12:27) [1]

Хук?


 
HF-Trade ©   (2006-02-17 12:41) [2]

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


 
begin...end ©   (2006-02-17 12:48) [3]

> 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).


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

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


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


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

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

> begin...end ©  

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


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

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


 
HF-Trade ©   (2006-02-17 13:28) [7]

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

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 14:19) [8]

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


 
begin...end ©   (2006-02-17 16:28) [9]

> 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.



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.081 c
4-1134648730
Deka
2005-12-15 15:12
2006.03.05
Сохранение заданного положения окна в Z-порядке.


2-1140010647
ButtonExplorer
2006-02-15 16:37
2006.03.05
Правильно ли так проверять, создан ли компонент?


15-1139390738
StriderMan
2006-02-08 12:25
2006.03.05
Не работает Break On Exception


1-1138440806
Zoidberg
2006-01-28 12:33
2006.03.05
Нужно закрыть окно при щелчке мышкой вне его


1-1138805220
voron70@yandex.ru
2006-02-01 17:47
2006.03.05
Нужна помощь в переводе с СИ на Delphi