Что нового

MouseMove не остановить. Почему?

CMEXProX

Новичок
Сообщения
2
Репутация
0
Приветствую вас, друзья.

Перед вами скрипт:

Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>



HotKeySet("{ESC}", "Terminate")

$Form1 = GUICreate('Auto refresher and mouse mover v0.9', 640, 480)

GUICtrlCreateLabel('X-coord Start:', 10, 10, 100, 20)
GUICtrlCreateLabel('Y-coord Start:', 10, 40, 100, 20)
GUICtrlCreateLabel('X-coord Finish:', 260, 10, 100, 20)
GUICtrlCreateLabel('Y-coord Finish:', 260, 40, 100, 20)

GUICtrlCreateLabel('Refresh and move frequency (s):', 10, 120, 100, 30)



$Input1sx = GUICtrlCreateInput(@DesktopWidth/2, 120, 10, 100, 20, BitOR(0x0002, 0x2000))
GUICtrlCreateUpdown(-1, 0x80)
GUICtrlSetLimit(-1, @DesktopWidth, 0)

$Input2sy = GUICtrlCreateInput(@DesktopHeight/2, 120, 40, 100, 20, BitOR(0x0002, 0x2000))
GUICtrlCreateUpdown(-1, 0x80)
GUICtrlSetLimit(-1, @DesktopHeight, 0)

$Input3fx = GUICtrlCreateInput(@DesktopWidth/2, 380, 10, 100, 20, BitOR(0x0002, 0x2000))
GUICtrlCreateUpdown(-1, 0x80)
GUICtrlSetLimit(-1, @DesktopWidth, 0)

$Input4fy = GUICtrlCreateInput(@DesktopHeight/2, 380, 40, 100, 20, BitOR(0x0002, 0x2000))
GUICtrlCreateUpdown(-1, 0x80)
GUICtrlSetLimit(-1, @DesktopHeight, 0)

$Input5rf = GUICtrlCreateInput(240, 120, 120, 100, 20, BitOR(0x0002, 0x2000))
GUICtrlCreateUpdown(-1, 0x80)

$Input6statusR = GUICtrlCreateInput("OFF", 10, 400, 120, 20, 0x0800)

$Input7statusM = GUICtrlCreateInput("OFF", 140, 400, 120, 20, 0x0800)

$Input8status = GUICtrlCreateInput(0, 270, 400, 120, 20, 0x0800)



$Button1 = GUICtrlCreateButton('Start refresher', 10, 450, 120, 20)
$Button2 = GUICtrlCreateButton('Start mouse mover', 140, 450, 120, 20)
$Button3 = GUICtrlCreateButton('Stop refresher', 270, 450, 120, 20)
$Button4 = GUICtrlCreateButton('Stop mouse mover', 400, 450, 120, 20)

Global $iCoordXsx, $iCoordYsy, $iCoordXfx, $iCoordYfy, $iTime, $iStatusR, $iStatusM, $iCount

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
            StartR()
		 Case $Button2
			$iCount = 1
            StartMM()
		 Case $Button3
            StopR()
		 Case $Button4
			$iCount = 99999
            StopMM()
    EndSwitch
WEnd

Func StartR()
	$iTime = GUICtrlRead($Input5rf)
	AdlibRegister("Refresher", $iTime*1000)
EndFunc

 Func StartMM()

   $iCoordXsx = GUICtrlRead($Input1sx)
   $iCoordYsy = GUICtrlRead($Input2sy)
   $iCoordXfx = GUICtrlRead($Input3fx)
   $iCoordYfy = GUICtrlRead($Input4fy)

	$iTime = GUICtrlRead($Input5rf)

   	For $iCount = 1 to 99999
    GUICtrlCreateInput("ON", 140, 400, 120, 20, 0x0800)
    MouseMove ( $iCoordXsx, $iCoordYsy, 300)
	Sleep($iTime*1000)
	MouseMove ( $iCoordXfx, $iCoordYfy, 500)
	$Input8status = GUICtrlCreateInput($iCount, 270, 400, 120, 20, 0x0800)
	$iCount = $iCount + 1
	if $iCount >= 99999 Then
	   StopMM()
	  EndIf
   Next
 EndFunc


Func StopR()
    AdlibUnRegister("Refresher")
	GUICtrlCreateInput("OFF", 10, 400, 120, 20, 0x0800)
 EndFunc

 Func StopMM()
	$iCount = 99999
   GUICtrlCreateInput("OFF", 140, 400, 120, 20, 0x0800)
EndFunc

Func Refresher()
   GUICtrlCreateInput("ON", 10, 400, 120, 20, 0x0800)
    Send('{F5}')
 EndFunc

 Func MouseMover()
	GUICtrlCreateInput("ON", 140, 400, 120, 20, 0x0800)
    MouseMove ( $iCoordXsx, $iCoordYsy, 300)
	Sleep($iTime*1000)
	MouseMove ( $iCoordXfx, $iCoordYfy, 500)
 EndFunc


Func Terminate()
    Exit
EndFunc   ;==>Terminate


Рефрешер стопится без проблем.
МоусМувер нет. Реакция на баттон4 (СтопММ) никакой. Пробовал и эту функцию делать через регистер AdlibRegister("MouseMover") - AdlibUnRegister("MouseMover"), но результат аналогичный. Пробовал через флаги (if a=1 bla bla bla, StopMM() a=0). Пробовал через While. Во всех кейсах StopMM() не вызывался. + счетчик (каунтер) цикла ММ считается по +2, а не +1, как задано.

Есть ли у кого какие идеи, почему так происходит?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
For $iCount = 1 to 99999
    GUICtrlCreateInput("ON", 140, 400, 120, 20, 0x0800)

вы в цикле создали 99999 элементов, вам это нужно?

CMEXProX [?]
Реакция на баттон4
вы в цикле For $iCount = 1 to 99999 нигде не проверяете что нажата кнопка.
 
Автор
C

CMEXProX

Новичок
Сообщения
2
Репутация
0
inververs сказал(а):
Код:
For $iCount = 1 to 99999
    GUICtrlCreateInput("ON", 140, 400, 120, 20, 0x0800)

вы в цикле создали 99999 элементов, вам это нужно?

CMEXProX [?]
Реакция на баттон4
вы в цикле For $iCount = 1 to 99999 нигде не проверяете что нажата кнопка.

да, это верно, но разве

Код:
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
            StartR()
		 Case $Button2
			$iCount = 1
            StartMM()
		 Case $Button3
            StopR()
		 Case $Button4
			$iCount = 99999
            StopMM()
    EndSwitch
WEnd


не проверяет кейсы?

и да. добавил 99999 циклов, т.к. их кол-во на самом деле не имеет значения, т.к. должно абортиться функцией StopMM.

и да, коллеги, вопрос скорее в другом.
почему если сделать две аналогичные функции

Func StartR()
AdlibRegister("Refresher", $iTime*1000)
EndFunc

Func StartR()
AdlibRegister("MouseMover", $iTime*1000)
EndFunc

то первая стопится функцией
AdlibUnRegister("Refresher")
а другая нет.
 
A

Alofa

Гость
inververs сказал(а):
... вы в цикле создали 99999 элементов...
Умножайте эту цифру на 2 :shok:

CMEXProX сказал(а):
... вопрос скорее в другом...
Да нет вопрос именно в том.
Код:
; ...
GUISetState()

While 1 ; Основной цикл скрипта (в вашем случае в кавычках)
	Switch GUIGetMsg()
; ...
		Case $Button2 ; При нажатии на кнопку идем в StartMM()
			$iCount = 1
			StartMM()
; ...
	EndSwitch
WEnd

Func StartMM()
; ...
	For $iCount = 1 To 99999
		GUICtrlCreateInput("ON", 140, 400, 120, 20, 0x0800) ; ...................... Создали Input
		MouseMove($iCoordXsx, $iCoordYsy, 300) ; ................................... Передвинули курсор мышки
		Sleep($iTime * 1000) ; ..................................................... Еще секунду (как минимум) подождали
		MouseMove($iCoordXfx, $iCoordYfy, 500) ; ................................... Опять передвинули курсор мышки
		$Input8status = GUICtrlCreateInput($iCount, 270, 400, 120, 20, 0x0800) ; ... Еще Input
		
;~ 		И так почти 100 000 раз!!!
;~ 		Пока процесс выполнения скрипта находится в этом цикле GUIGetMsg() не выполняется => кнопки GUI работать не будут.
;~ 		Минимальное время выполнения только данного цикла 99999*1 секунд, т.е. чуть больше суток :)
; ...
	Next
EndFunc

CMEXProX сказал(а):
... почему если сделать две аналогичные функции

Func StartR()
AdlibRegister("Refresher", $iTime*1000)
EndFunc

Func StartR()
AdlibRegister("MouseMover", $iTime*1000)
EndFunc

то первая стопится функцией
AdlibUnRegister("Refresher")
а другая нет.
Потому, что они не аналогичные.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Alofa [?]
Умножайте эту цифру на 2
shocked.gif
А ну да.CMEXProX
Элементы создаются 1 раз, в самом начале. Если нужно менять данные в них, то есть другие функции.

В цикле for $i to n не нужно делать $i = $i+1

Запомните, если у вас есть цикл, который нужно останавливать кнопочками, то в этом цикле нужно делать хоть какие то проверки, что кнопка нажата.
 
Верх