1 (изменено: bigden, 2011-12-30 16:50:39)

Тема: AHK: Параллельно (одновременно) выполнить несколько действий по хоткею

Что делает скрипт сейчас? По нажатию левой кнопки мыши, зажимается левая кнопка мыши и мышь перемещается в определенном направлении. Когда я отпускаю левую кнопку мыши, мышь двигаться перестает и левая кнопка мыши отпускается. Еще с помощью Alt+стрелка можно изменять значения XAxis и YAxis и соответственно менять направление и скорость движения мыши по нажатию левой кноки мыши.

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

;SetTitleMatchMode 3 ; Название окна должно полностью совпадать
;#IfWinActive , XXX, 

; Считываются параметры из NR.ini

IniRead , XAxis, NR.ini, Main, XAxis, %XAxis%
IniRead , YAxis, NR.ini, Main, YAxis, %YAxis%

timer = 10
PauseOn = 0
SleepTime = 25

; После нажатия левой кнопки мыши, зажимается левая кнопка мыши и мышь начинает перемещаться.
*$lButton::

Send {LButton Down}

LOOP
{
DllCall("mouse_event", UInt, 0x1
                              , Int, XAxis
                              , Int, -YAxis
                              , UInt, 0
                              , Int, 0)
			Sleep, SleepTime
GetKeyState, state, lButton, P
if state = U
break
}
Return

LButton Up::
{
Send {LButton Up}
}
Return

; Звуковое оповещение при Suspend'e скрипта

*$XButton1::

    Suspend
    If not SuspendOn
    {
        SuspendOn = 1
        SoundPlay, C:\Windows\Media\Windows Logoff Sound.wav
    }
    Else
    {
        SuspendOn = 0
        SoundPlay, C:\Windows\Media\Windows Logon Sound.wav
    }
Return




; Дальше идет регулировка значений XAxis и YAxis и вывод текущего значения на экран. Это нужно для того, чтобы указывать направление движения мыши, когда жмется левая кнопка мыши

!Right::
!Left::

XAxis := 80
XAxis_Step = 1 ; шаг регулировки

vol_DisplayTime_XAxis = 1500
vol_TransValue_XAxis = 500
vol_CW_XAxis = 000000 
vol_Thick_XAxis = 10
vol_PosX := 1996
vol_PosY := 1108
vol_Width = 50
vol_BarOptionsMaster_XAxis = 1:B1 R0-299 ZH%vol_Thick_XAxis% ZX8 ZY4 W%vol_Width% X%vol_PosX% Y%vol_PosY% CW%vol_CW_XAxis%

IniRead , XAxis, NR.ini, Main, XAxis, %XAxis%

XAxis += (InStr(A_ThisHotkey, "!Left") ? -XAxis_step : XAxis_step )

IniWrite , %XAxis%, NR.ini, Main, XAxis

vol_ShowBars_XAxis:
vol_Master := XAxis

if vol_Master <> 80
{
vol_Colour = F19720 
vol_Text = %XAxis%
}

Else
{
vol_Colour = red
vol_Text = %XAxis%
}

IfWinNotExist, Rapidfire

{
WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

Gui +AlwaysOnTop

Progress , %vol_BarOptionsMaster_XAxis% CT%vol_Colour% CB%vol_Colour%, , %vol_Text%, Rapidfire

WinSet, Transparent, %vol_TransValue_XAxis%, Rapidfire

WinSet, ExStyle, % "+" WS_EX_LAYERED|WS_EX_TRANSPARENT, Rapidfire
Gui -Caption +ToolWindow
}

Progress, 1:%vol_Master% , , %vol_Text%

SetTimer, vol_BarOff_XAxis, %vol_DisplayTime_XAxis%
return

vol_BarOff_XAxis:
SetTimer, vol_BarOff_XAxis, off
Progress, 1:Off
return


!Up::
!Down::

YAxis := 80
YAxis_Step = 1 ; шаг регулировки

vol_DisplayTime_YAxis = 1500
vol_TransValue_YAxis = 500
vol_CW_YAxis = 000000 
vol_Thick_YAxis = 10
vol_PosX := 1996
vol_PosY := 1108
vol_Width = 50
vol_BarOptionsMaster_YAxis = 1:B1 R0-299 ZH%vol_Thick_YAxis% ZX8 ZY4 W%vol_Width% X%vol_PosX% Y%vol_PosY% CW%vol_CW_YAxis%

IniRead , YAxis, NR.ini, Main, YAxis, %YAxis%

YAxis += (InStr(A_ThisHotkey, "!Down") ? -YAxis_step : YAxis_step )

IniWrite , %YAxis%, NR.ini, Main, YAxis

vol_ShowBars_YAxis:
vol_Master := YAxis

if vol_Master <> 80
{
vol_Colour = F19720 
vol_Text = %YAxis%
}

Else
{
vol_Colour = red
vol_Text = %YAxis%
}

IfWinNotExist, Rapidfire

{
WS_EX_TRANSPARENT := 0x20
WS_EX_LAYERED := 0x80000

Gui +AlwaysOnTop

Progress , %vol_BarOptionsMaster_YAxis% CT%vol_Colour% CB%vol_Colour%, , %vol_Text%, Rapidfire

WinSet, Transparent, %vol_TransValue_YAxis%, Rapidfire

WinSet, ExStyle, % "+" WS_EX_LAYERED|WS_EX_TRANSPARENT, Rapidfire
Gui -Caption +ToolWindow
}

Progress, 1:%vol_Master% , , %vol_Text%

SetTimer, vol_BarOff_YAxis, %vol_DisplayTime_YAxis%
return

vol_BarOff_YAxis:
SetTimer, vol_BarOff_YAxis, off
Progress, 1:Off
return

Я могу сделать что-то вроде этого:

*$lButton::

LOOP
{
Send {LButton Down}
Sleep, 10
Send {Lbutton Up}
Sleep, 10
DllCall("mouse_event", UInt, 0x1
                              , Int, XAxis
                              , Int, -YAxis
                              , UInt, 0
                              , Int, 0)
			Sleep, SleepTime
GetKeyState, state, lButton, P
if state = U
break
}
Return

Но это будет не параллельно, а последовательно, а мне нужно именно параллельно. Может есть идеи, как все-таки сделать параллельно?
До меня не доходит, как все-таки сделать параллельно.