1 (изменено: Foma, 2016-08-19 23:28:29)

Тема: AHK: Быструю прокрутку на трещотку

Купил трекбол, а на нём колёсико без быстрой прокрутки  жутка тугая трещотка. Можно как-то сымитировать быструю прокрутку программно? Причём так, чтобы ловило только это колёсико, поскольку на мышке всё в порядке.

2

Re: AHK: Быструю прокрутку на трещотку

"Быстрая прокрутка" - это перемещение мышки при зажатой СКМ?

3

Re: AHK: Быструю прокрутку на трещотку

Нет, это когда можно крутануть колёсико без трещотки и оно свободно вращаясь прокрутит 2000 строк кода. Удобно! Можно быстро крутить, притормаживать, возвращаться управляя одним пальцем в одно месте. Может это правильно называется "инерционная прокрутка"?

4

Re: AHK: Быструю прокрутку на трещотку

А, ясно. Это должно быть как колёсико мышки, только без фиксации.
Можно сделать программно ускоренную прокрутку, но это затронет и мышку. Есть другой вариант. У меня раньше была мышка, с чресчур тугой трещоткой в колёсике. Я её разобрал, подточил трещотку, и всё стало как по маслу. Вероятно, и в трекболе так же можно сделать.

5

Re: AHK: Быструю прокрутку на трещотку

Жалко курочить новый. Он же на гарантии.
А никак нельзя отследить какой из агрегатов посылает команду, чтобы один обрабатывать, а второй - нет?
Если совсем уж нельзя, то наверное можно хоткей повесить, чтобы переключал on/off?

6

Re: AHK: Быструю прокрутку на трещотку

Как-нибудь так:

WheelUp:: Send, {WheelUP 10}
WheelDown:: Send, {WheelDown 10}
F11:: Suspend

7

Re: AHK: Быструю прокрутку на трещотку

Foma пишет:

А никак нельзя отследить какой из агрегатов посылает команду, чтобы один обрабатывать, а второй - нет?

Можно.

По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

8

Re: AHK: Быструю прокрутку на трещотку

Пара функций там не задана. Нашёл их в сети, но теперь уже там у них внутри не хватает. Может есть готовый вариант?

9

Re: AHK: Быструю прокрутку на трещотку

ypppu, что-то такое я пожалуй и сам соорудил бы. Я думал о какой-то более близкой имитации. С меняющейся скоростью, торможением и т.д.
Наверное нет варианта кроме привязывания скорости к количеству щелчков подряд? А торможение встречным щелчком.

10

Re: AHK: Быструю прокрутку на трещотку

А что там сложного?

a := 3
b := 10

WheelUp:: Send, {WheelUP %a%}
WheelDown:: Send, {WheelDown %b%}

Скорость прокрутки можно задавать, включайте фантазию.
К примеру, при удержании Alt ускорить в 2 раза. При удержании Ctrl - в 4 раза. А если сразу Alt и Ctrl - в 8 раз. Как вариант.

11

Re: AHK: Быструю прокрутку на трещотку

А отследить два щелчка подряд колёсиком в одну сторону сложно?
С клавиатурой не интересно. Тогда уже там "Up" или "Down" можно нажать.
Наверное ещё подумаю про изменение паузы между срабатыванием клавиш  внутри отправки нажатий.

12

Re: AHK: Быструю прокрутку на трещотку

Foma пишет:

Пара функций там не задана. Нашёл их в сети, но теперь уже там у них внутри не хватает.

https://autohotkey.com/board/topic/3801 … functions/.
В 19 строке посмотреть имя устройства, и прописать его в 10 строку.

#SingleInstance Force
#Persistent    
#NoEnv
ListLines Off  
SetBatchLines -1
 
AHKHID_UseConstants() 
AHKHID_Register(1, 2, A_ScriptHwnd, RIDEV_INPUTSINK ) 
OnMessage(0x00FF, "InputMsg") ; WM_INPUT 
Mice2 = \\?\HID#VID_0518&PID_0001&MI_01&Col01#8&3125ebc9&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
Return
 

InputMsg(wParam, lParam) {
    Local ProdName, DevHandle 
    Critical      
    DevHandle := AHKHID_GetInputInfo(lParam, II_DEVHANDLE) 
    ProdName := AHKHID_GetDevName(DevHandle, True) ; имя устройства     
	ToolTip % ProdName
    IsMice2 := ProdName = Mice2 ? 1 : 0
}  

#If IsMice2

WheelUp::
	ToolTip % A_ThisHotkey
    Return

WheelDown::
	ToolTip % A_ThisHotkey
    Return

#If
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

13

Re: AHK: Быструю прокрутку на трещотку

serzh82saratov, спасибо. Заменил ToolTip на буфер и вставил в код. Работает!

14 (изменено: Foma, 2016-08-21 14:08:49)

Re: AHK: Быструю прокрутку на трещотку

Хочу организовать повторение, а потом и постепенное ускорение прокручивания после поворота колеса.
Первое что пришло в голову - это конечно цикл.

WheelUp::
	loop, 10
		{
		Send,{Up %A_index%}
		If (A_ThisHotkey = "WheelDown")
			break
		ToolTip, %A_index% %A_ThisHotkey%
		}
    Return

WheelDown::
	Send,{Down}
    Return

Но он же не прерывается так. Что посоветуете?

15 (изменено: serzh82saratov, 2016-08-21 14:56:40)

Re: AHK: Быструю прокрутку на трещотку

Тут вариантов очень много, тем более без чётко поставленной задачи.
Например:


Sleep := MaxSleep := 90, Step := 30

WheelUp::
WheelDown::
	HD := InStr(A_ThisHotkey, "Up") ? "Up" : "Down"
	If (Sleep != MaxSleep && HD != D) {
		D := HD, Sleep := MaxSleep
		SetTimer, UpDown, Off
		Return
	} 
	D := HD, Sleep := Sleep >= Step ? Sleep - Step : Sleep
	SetTimer, UpDown, -%Sleep%
    Return 

UpDown: 
	SendInput {%D%}
	SetTimer, UpDown, -%Sleep% 
	Return
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

16 (изменено: Foma, 2016-08-21 18:54:00)

Re: AHK: Быструю прокрутку на трещотку

Получилось. Даже с ускорением. Пробую привыкнуть. Пока не нашёл как сделать максимальную и стартовую более отличающимися. Пробовал 30 и 3, 100 и 1.

17 (изменено: serzh82saratov, 2016-08-22 02:36:52)

Re: AHK: Быструю прокрутку на трещотку

Так нагляднее. В oSleep задержки в мс, первое нажатие 60 мс между Send, после второго 30 и.т.д. Кол-во задержек любое.

oSleep := [60,30,0], I := 0

WheelUp::
WheelDown::
	HD := A_ThisHotkey = "WheelUp" ? "Up" : "Down"
	If (I && HD != D) {
		D := HD, I := 0
		SetTimer, UpDown, Off
		Return
	} 
	D := HD, I += I != oSleep.MaxIndex()
	SetTimer, UpDown, % "-" oSleep[i]
    Return 

UpDown: 
	SendInput {%D%}
	SetTimer, UpDown, % "-" oSleep[i] 
	Return
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

18

Re: AHK: Быструю прокрутку на трещотку

Чуть изменил:


SetBatchLines -1
SetKeyDelay, 0
oSleep := [80,30,10,3,0], I := 0
_______

WheelUp::
WheelDown::
	HD := A_ThisHotkey = "WheelUp" ? "Up" : "Down"
	If (I && HD != D) {
		D := HD, I := 0
		SetTimer, UpDown, Off
		Return
	} 
	D := HD, I := I = oSleep.MaxIndex() ? I : I + 1
	SetTimer, UpDown, % "-" oSleep[i]
    Return 

UpDown: 
	SendInput {%D% 2}
	SetTimer, UpDown, % "-" oSleep[i] 
	Return

Ещё одно пожеланин, если позволите.  Как можно сделать, чтобы таймер останавливался при нажатии любой клавиши, в том числе мыши? А то при достижении конца страницы не всегда видно, что прокрутка продолжается.

19 (изменено: serzh82saratov, 2016-08-22 11:51:25)

Re: AHK: Быструю прокрутку на трещотку

Ну на все клавиши сложнее, думаю клик и альт в большинстве случаев будет достаточно.


SetBatchLines -1
SetKeyDelay, 0
oSleep := [80,30,10,3,0], I := 0

 
WheelUp::
WheelDown::
	HD := A_ThisHotkey = "WheelUp" ? "Up" : "Down"
	If (I && HD != D) {
		D := HD, I := 0
		SetTimer, UpDown, Off
		Return
	} 
	D := HD, I += I != oSleep.MaxIndex()
	Try SetTimer, UpDown, % "-" oSleep[i]
    Return 
 
UpDown: 
	SendInput {%D% 2}
	Try SetTimer, UpDown, % "-" oSleep[i]
	Return
	
	
#If I && !(I := 0)
~Alt:: 
~LButton:: SetTimer, UpDown, Off
#If 
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

20

Re: AHK: Быструю прокрутку на трещотку

Убрал лямбду. Иначе во время прокрутки случаются ненужные клики по подвернувшимся объектам.
Клавиши для отправки заменил на колесо.
Ввёл меняющийся шаг.


oSleep := [100,50,20,10,0], I := 0

#If IsMice2

WheelUp::
WheelDown::
	HD := A_ThisHotkey = "WheelUp" ? "WheelUp" : "WheelDown"
	If (I && HD != D) {
		D := HD, I := 0
		SetTimer, UpDown, Off
		Return
	} 
	D := HD, I := I = oSleep.MaxIndex() ? I : I + 1
	;ToolTip,% "5 " oSleep[i] " " D
	ToolTip,
	SetTimer, UpDown, % "-" oSleep[i]
    Return 

UpDown: 
	;ToolTip,% "5 " oSleep[i] " " D
	ToolTip, ========================================================================================
	SendInput {%D% %I%}
	SetTimer, UpDown, % "-" oSleep[i] 
	;ToolTip
	Return
#If


#If I && !(I := 0)
LButton::
I := 0
SetTimer, UpDown, Off
ToolTip,
Return
#If 

Хорошо получилось. Раз остановка только на ЛКМ, пока не решил как, и надо ли, сделать так, чтобы и любое встречное движение колеса останавливало прокрутку. Иногда трудно поймать именно 1 щелчок и начинается обратная прокрутка, которую опять надо ловить.

21

Re: AHK: Быструю прокрутку на трещотку

Наверное даже не так надо. Надо, чтобы встречное движение уменьшало скорость прокрутки, а если поворот сильнее, чем можно уменьшить текущую скорость, то останавливало бы.

22 (изменено: serzh82saratov, 2016-08-22 13:56:05)

Re: AHK: Быструю прокрутку на трещотку

SetMouseDelay, 0

oSleep := [100,50,20,10,0], I := 0

WheelUp::
WheelDown::
	HD := A_ThisHotkey = "WheelUp" ? "WheelUp" : "WheelDown" 
	D := I = 0 ? HD : D
	I := (D = HD) ? I + (I != oSleep.MaxIndex()) : I - !!I
	Try SetTimer, UpDown, % "-" oSleep[i]
    Return

UpDown: 
	ToolTip,% I "`n"  oSleep[i] "`n" D 
	SendInput {%D% %I%}
	Try SetTimer, UpDown, % "-" oSleep[i] 
	Return 


#If I && !(I := 0)
LButton:: 
	SetTimer, UpDown, Off
	ToolTip
	Return
#If 
По вопросам возмездной помощи пишите в личку
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.24.05 (Unicode 32-bit).

23

Re: AHK: Быструю прокрутку на трещотку

Значительно лучше. Только при скорости, например на 2 щелчка, щёлкнуть 4 в обратную сторону, не останавливается, а начинает прокручивать навстречу. Если это решить, то пожалуй остановку по клику мышки можно тоже убирать.

24 (изменено: Foma, 2016-12-25 21:39:51)

Re: AHK: Быструю прокрутку на трещотку

Перешёл на win10 и почему-то временами скрипт перестаёт работать. Причём обычно в Chrome, а в блокноте всё отлично, как и раньше. Скрипт не видит срабатывание колеса(Mice2 = 0), хотя, шарик и кнопки видит сразу(Mice2 = 1). Иногда после рестарта, какое-то время нормально, а потом опять не работает. Возможно есть связь с открытием новых окон Chrome.
  Отчего такое может быть и как исправить?

25

Re: AHK: Быструю прокрутку на трещотку

Может в это время сильно загружен процессор? Процессу AutoHotkey можно повысить приоритет.