Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

Как перехватить событие 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.017 c
15-1138602666
Knight
2006-01-30 09:31
2006.03.05
АС "Бюджет 6.0"... НПО "Криста"


2-1140012790
Id
2006-02-15 17:13
2006.03.05
comboBox1.Style:=csDropDownList


2-1140262804
saintninja
2006-02-18 14:40
2006.03.05
Помогите плизз


2-1140240800
Начинающий5
2006-02-18 08:33
2006.03.05
Редактирование данных в запросе


2-1140297348
Alex_C
2006-02-19 00:15
2006.03.05
Перехват нажатия клавиш





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский