1

Тема: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

При быстром вращении колесика мыши вместо горячих клавиш "wheelup" и "wheeldown" срабатывает обычное вращение.
Blockinput не помогает:


wheelup::
Blockinput, on
... (действия)
Blockinput, off
return

- все равно срабатывает обычное вращение.

Нашел в справке следующее:
"If the wheel is being turned quickly (depending on type of mouse), A_EventInfo may be greater than 1."

Значит ли это, что вращение не будет пропускаться, если использовать особую мышь, при работе которой EventInfo больше 1 (при быстром вращении колесика)?
Если да, как можно подобрать такую мышь, если нет, что может помочь предотвратить пропуск вращения?

2

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Нет, думаю, не значит. А конкретный пример кода можете привести (желательно попроще), где у вас этот эффект наблюдается?

3

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

У меня мышь A4Tech WOP-35. Пробовал такой код:

wheelup::
Blockinput, on
SoundBeep, 4000, 20
Blockinput, off
return

Хоть быстро, хоть медленно вращаю колёсико, работает такое правило:
- если запущена программа-драйвер iWheelWorks, то в окнах с полосами прокрутки будет работать только прокрутка, в окнах без полос прокрутки будет работать SoundBeep;
- если не запущена iWheelWorks, всегда будет работать только SoundBeep.

Поэтому предполагаю, что у Вас также работает программа для мышки, которую можно отключить.

4 (изменено: studentarh, 2012-12-09 16:06:27)

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Программы, похожей на iWheelWorks у меня нет, сбой возникает только при быстром вращении. Эффект наблюдается в Автокаде, но, оказалось, только с этим скриптом. Сделать простой пример с такой же ошибкой не получилось (ошибки нет во всех моих вариантах простого примера). Но хотя бы понял, что ошибка в скрипте. Скрипт довольно длинный и связан с другим (другой на автолиспе), буду сам проверять. Если найду ошибку, напишу здесь. Плохо конечно, что сразу не попробовал простой пример сделать, тогда бы не создавал тему, учту это в будущем.

5 (изменено: creature.ws, 2012-12-09 17:00:30)

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Колесо прокрутки генерирует быстрые «клики», пропущены «как обычные» они могут быть в том случае, если мышиный хук их не заблокирует.

Видимо, часть кликов происходит ранее чем autohotkey производит вызов CallNextHookEx.
Решить проблему нет возможности.

6

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

То есть, autohotkey производит вызов CallNextHookEx реже, чем генерируются мышью клики колесика?
Но от чего зависит частота вызовов CallNextHookEx?
Просто хотелось бы знать это, чтобы можно было оценить вероятность возникновения такого сбоя в других скриптах.

7 (изменено: creature.ws, 2012-12-09 21:21:49)

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Установка хуков на события мыши и клавиатуры
AutoHotkey_L source code

8

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Для блокировки срабатывания последующих "кликов" при быстром вращении колеса обычно используют такой вариант:

i := 0
WheelUp::
WheelDown::
   If (A_PriorHotkey = A_ThisHotkey && A_TimeSincePriorHotkey < 200)
      return
   ToolTip % ++i   ; здесь необходимые действия
   return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Блокировка с условием при разных значениях времени также не помогает. Видно все-таки не исправить. Информацию по ссылкам буду изучать. Спасибо!

10

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

studentarh пишет:

Блокировка с условием при разных значениях времени также не помогает. Видно все-таки не исправить. Информацию по ссылкам буду изучать. Спасибо!

Может дело в маленьком #MaxHotkeysPerInterval?

11

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

#MaxHotkeysPerInterval наоборот большой, 200 было. Пробовал менять, при маленьких значениях у меня сообщение появляется (с вопросом - продолжить или нет), при увеличении ничего не меняется (сбой по-прежнему тот же). Но вообще сбой возникает только при очень быстром вращении, просто буду крутить помедленнее.

12 (изменено: creature.ws, 2012-12-12 02:22:52)

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Приведите код к виду:

WheelUp::Settimer, Some_label_name, -1

Some_label_name:
   ; действия первоначально выполнявшиеся в подпрограмме горячей клавиши WheelUp
   return

13 (изменено: studentarh, 2012-12-12 12:49:38)

Re: AHK: Пропуск в систему вращения колесика мыши (вместо горячих клавиш)

Попробовал с таймером, как сказано, тоже не помогает.
Решил заблокировать мышь путем создания неактивного полупрозрачного окна поверх окна Автокада (созданное окно захватывает мышь, Автокад не получает координаты курсора, а для работы колесика они нужны). Но, оказалось, что Автокад перехватывает курсор при вращении колесика. Так заблокировать колесико в окне Автокада тоже не получилось (хотя в других окнах блокируется, правда только в некоторых).


Но за-то так точно можно заблокировать движение мыши в активном окне (то есть курсор будет двигаться (в отличие от blockinput, если я правильно понял), но активное окно не будет получать координаты курсора). Тема уже другая, но близкая, поэтому решил здесь продолжить, чтобы не создавать новую. Блокировать таким образом мышь может быть нужно, например, при настройке чего-либо по положению курсора. Значение изменяемого при такой настройке параметра можно рассчитать как произведение максимального значения на a/b, где a - текущая координата курсора, b - соответствующий размер экрана (можно менять сразу два параметра по двум координатам). Сделал такую настройку для одного инструмента в Автокаде, но при настройке курсор вместе с изображением инструмента двигается, что плохо, и это как раз исправляется особой блокировкой мыши.
Если есть стандартное решение или просто другое решение для такой блокировки, напишите пожалуйста об этом. Ну, а если нет, может быть мои функции пригодятся другим участникам.
Вот сами функции блокировки и вариант их использования:


; блокировка мыши в заданной области
; (положение и размеры, цвет, прозрачность области блокировки)
mouseoff(x, y, w, h, color, transparent)
{
    if !transparent
        transparent=1
    Gui, +Hwnd_mouseblock +LastFound +AlwaysOnTop -Caption +ToolWindow
    Gui, Color, %color%
    WinSet, Transparent, %transparent%,
    Gui, Show, NoActivate x%x% y%y% w%w% h%h%
}

; включение мыши
mouseon()
{
    global
    if _mouseblock
    {
        Gui %_mouseblock%:Destroy
        _mouseblock=
    }
}


    
; горячие клавиши
f11::  ; включение / выключение блокировки для всего экрана
if _mouseblock
    mouseon()
else
    mouseoff(0, 0, a_screenwidth, a_screenheight, 0, 0)
return

#if _mouseblock
lbutton::   ; блокировка кнопок мыши
rbutton::
mbutton::
return