1

Тема: AHK: 2+ цикла в цикле, +старт по состоянию "хоткея"

Здравствуйте дорогие форумчане.
Я тут не дано и пока не все понимаю Хотел бы попросить помощи.
А именно:
Не подскажите как сделать в этом скрипте:

+ открыть спойлер
#NoEnv
SendMode Input

~F6::Suspend

~End::ExitApp

~LCtrl & ~LButton::
Loop
	If GetKeyState("LButton", "LCtrl") {
		Sleep, 1
		moveAmount := (moveAmount = 2) ? 3 : 0
 		mouseXY(moveAmount,4.2)
		
	}
	else
	break
	
Return



mouseXY(x,y)
{
DllCall("mouse_event",int,1,int,x,int,y,uint,0,uint,0)
}

"Цикл внутри цикла, с интервалом"

Сейчас скрипт работает так:
Скрипт просто плавно ведёт курсор вниз. При нажатие Ctrl+ЛКМ. При отжатие лкм или контрола курсор останавливаться.

А надо сделать так:
Что бы при нажатие на ctrl+лкм курсор плавно опускался вниз, а через 1.5 секунды двигался вниз по "косой", по диоганали влево, ещё через 1.5 секунда двигался вниз по диоганали вправо. При отжиме ctrl или лкм скрипт останавливался.

Как я понял должно быть 3 или 4 цикла, но я не понимаю как сделать так что бы они работали последовательно друг за другом. Но назначено все это было на ctrl+лкм. Что бы когда отжал ctrl или лкм все останавливалось.

Помогите пожалуйста.
Спасибо!

2 (изменено: stealzy, 2017-09-07 18:47:36)

Re: AHK: 2+ цикла в цикле, +старт по состоянию "хоткея"

Давайте без соплей "помогите пожалуйста" и "попросить помощи".
Чтобы не писать вручную такие циклы можно воспользоваться LLMouse - готовой наработкой для низкоуровнего (≈для игр) движения мышкой.
Цикл конечно, никуда ни денется, просто он переезжает внутрь ф-ии и не мозолит глаза. Таким образом код становится гораздо понятнее.

#SingleInstance,Force
F11::LLMouse.Wheel(-1, 2, 100) ; Send 2x mouse wheel down rolls at rate of 100ms

~LCtrl & ~LButton::
	LLMouse.Move(0, 1, 300, 5) ; y+0, x+1; 300 moves * 5ms = 1,5s
	LLMouse.Move(-1, 1, 300, 5)
	LLMouse.Move(1, 1, 300, 5)
	Return

; =======================================================================================
; LLMouse - A library to send Low Level Mouse input

; times	- How many times to send the requested action. Optional, default is 1
; rate	- The rate (in ms) to send the action at. Optional, default rate varies
; Note that if you use a value for rate of less than 10, special code will kick in.
; QPX is used for rates of <10ms as the AHK Sleep command does not support sleeps this short
; More CPU will be used in this mode.
class LLMouse {
	static MOUSEEVENTF_MOVE := 0x1
	static MOUSEEVENTF_WHEEL := 0x800

	; ======================= Functions for the user to call ============================
	; Move the mouse
	; All values are Signed Integers (Whole numbers, Positive or Negative)
	; x		- How much to move in the x axis. + is right, - is left
	; y		- How much to move in the y axis. + is down, - is up
	Move(x, y, times := 1, rate := 1){
		this._MouseEvent(times, rate, this.MOUSEEVENTF_MOVE, x, y)
	}

	; Move the wheel
	; dir	- Which direction to move the wheel. 1 is up, -1 is down
	Wheel(dir, times := 1, rate := 10){
		static WHEEL_DELTA := 120
		this._MouseEvent(times, rate, this.MOUSEEVENTF_WHEEL, , , dir * WHEEL_DELTA)
	}

	; ============ Internal functions not intended to be called by end-users ============
	_MouseEvent(times, rate, dwFlags := 0, dx := 0, dy := 0, dwData := 0){
		Loop % times {

			DllCall("mouse_event", uint, dwFlags, int, dx ,int, dy, uint, dwData, int, 0)
			if (A_Index != times){	; Do not delay after last send, or if rate is 0
				if (rate >= 10){
					Sleep % rate
				} else {
					this._Delay(rate * 0.001)
				}
			}
		}
	}

	_Delay( D=0.001 ) { ; High Resolution Delay ( High CPU Usage ) by SKAN | CD: 13/Jun/2009
		Static F ; www.autohotkey.com/forum/viewtopic.php?t=52083 | LM: 13/Jun/2009
		Critical
		F ? F : DllCall( "QueryPerformanceFrequency", Int64P,F )
		DllCall( "QueryPerformanceCounter", Int64P,pTick ), cTick := pTick
		While( ( (Tick:=(pTick-cTick)/F)) <D ) {
			DllCall( "QueryPerformanceCounter", Int64P,pTick )
			Sleep -1
		}
		Return Round( Tick,3 )
	}
}

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

If Not GetKeyState("LButton")
	Return

Кстати команду GetKeyState вы использовали с ошибкой - прочитайте про нее в справке. Чтобы написать правильно, вам понадобятся скобки и оператор OR.

3 (изменено: romzes96, 2017-09-07 19:22:20)

Re: AHK: 2+ цикла в цикле, +старт по состоянию "хоткея"

stealzy пишет:

чтобы мышь перестала двигаться по отпусканию левой кнопки мыши?

Можно остановку скрипта сделать по "отпусканию" любой из кнопок. (?) (Ctrl, ЛКМ) (В обоих "сценариях")

4 (изменено: stealzy, 2017-09-07 23:21:43)

Re: AHK: 2+ цикла в цикле, +старт по состоянию "хоткея"

romzes96 пишет:

Можно остановку скрипта сделать по "отпусканию" любой из кнопок. (?)

stealzy пишет:

вам понадобятся скобки и оператор OR.

5

Re: AHK: 2+ цикла в цикле, +старт по состоянию "хоткея"

stealzy
Спасибо большое я Вас понял.