Что нового

Создание и реализация форм(ы)

warshadow

Новичок
Сообщения
62
Репутация
0
Добрый день! Вопросик такой, столкнулся недавно с AutoIT, написал пару простеньких программ..но что то все время лазить в дебагер и переправлять код поднадоело...хочется чтобы при запуске .exe вылезала форма, а не сразу работал скрипт\действие.
В общем скачал я Koda,иммитация VB, создал форму, Importировать не удалось мне ее, но код скопировал в программу, получилось что то вроде этого:
Код:
#include <GUIConstants.au3>
$Form1 = GUICreate("БОТ ", 420, 213, 518, 254)
$Label1 = GUICtrlCreateLabel("Количество заходов", 32, 24, 107, 17)
$txtN = GUICtrlCreateInput("", 160, 24, 145, 21)
$cmdRun = GUICtrlCreateButton("Ботить!", 152, 88, 89, 33, 0)
$cmdCLose = GUICtrlCreateButton("Завершить", 296, 192, 121, 17, 0)
GUISetState(@SW_SHOW)
While 1
		$nMsg = GUIGetMsg()
		 	Switch $nMsg
						Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
Мой вопрос заключается в том, как например для кнопки cmdCLose задать действия типа Application.Exit() или me.Close()?
И кнопке cmdRun задать на нее действие?
В простом программировании открывается событийная процедура кнопки и в ней пишется мои действия.
Заранее спасибо)
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Добрый день.
Позволю себе так ответить:
Код:
#include <GUIConstants.au3>
$Form1 = GUICreate("БОТ ", 420, 213, 518, 254)
$Label1 = GUICtrlCreateLabel("Количество заходов", 32, 24, 107, 17)
$txtN = GUICtrlCreateInput("", 160, 24, 145, 21)
$cmdRun = GUICtrlCreateButton("Ботить!", 152, 88, 89, 33, 0)
$cmdCLose = GUICtrlCreateButton("Завершить", 296, 192, 121, 17, 0)
GUISetState(@SW_SHOW)
While 1
      $nMsg = GUIGetMsg()
          Switch $nMsg
					Case $GUI_EVENT_CLOSE
			  
         Exit
					Case $cmdRun
						;$text = GUICtrlRead($txtN)
						MsgBox(64, "БОТ", "Нажали на Ботить считали текст и что-то сделали")
						MsgBox(64, "БОТ", "Количество заходов: " & GUICtrlRead($txtN))
					Case $cmdCLose
						Exit
		 
   EndSwitch
WEnd
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
#include <GUIConstants.au3>
$Form1 = GUICreate("БОТ ", 420, 213, 518, 254)
$Label1 = GUICtrlCreateLabel("Количество заходов", 32, 24, 107, 17)
$txtN = GUICtrlCreateInput("", 160, 24, 145, 21)
$cmdRun = GUICtrlCreateButton("Ботить!", 152, 88, 89, 33, 0)
$cmdCLose = GUICtrlCreateButton("Завершить", 296, 192, 121, 17, 0)
GUISetState(@SW_SHOW)
While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $GUI_EVENT_CLOSE OR $cmdCLose
            ExitLoop
      EndSwitch
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Тогда уж еще чуть проще:
Код:
;.....................
Case $GUI_EVENT_CLOSE , $cmdCLose
     ExitLoop
;.....................
 
Автор
W

warshadow

Новичок
Сообщения
62
Репутация
0
Код:
$plus = GUICtrlCreateButton("+", 152, 140, 89, 33, 0)
$cmdCLose = GUICtrlCreateButton("Завершить", 296, 192, 121, 17, 0)
$n=1
$count=100
$vibr1=0
$vibr2=0
GUISetState(@SW_SHOW)
HotKeySet("s", "stop1")    ; Call function test() on ctrl+alt+d
Func stop1 ()
	Exit()
	EndFunc

While 1
		$nMsg = GUIGetMsg()
		 	Switch $nMsg
						Case $GUI_EVENT_CLOSE
			Exit
						
		Case $cmdRun
			            $x=$vibr1
						$y=$vibr2
						Opt("MouseCoordMode", 2)
						ControlClick("В Контакте | Агрохолдинг (бета) - Mozilla Firefox","","MozillaWindowClass3")
						WinWait("В Контакте | Агрохолдинг (бета) - Mozilla Firefox","")
							For $k=0 to $count
								sleep(5000)
						AutoItSetOption ( "MouseClickDelay", 40 )
						MouseClick("left", $x, $y, 10)
						Next
                    Case $cmdCLose
                        Exit
						
					Case $plus
								$n=$n+20
							For $i=1 to $n
							If $i=1 Then
						$vibr1 = GUICtrlCreateInput("", 1, 10+$n,30 ,15)
							$vibr2=GUICtrlCreateInput("", 40, 10+$n, 30, 15)
						EndIf
					Next
				      						
				
	EndSwitch
WEnd

Разобрался, спасибо!)))
Но есть еще 3 вопроса:
1)я сделал чтобы при нажатии на кнопку "+" добавлялись 2 текстбокса, в дальнейшем для ввода значений мыши x и y
Вопрос таков как мне реализовать это? я только как ни пробывал, любые значения ввожу и такое чувство что идет в точку 0,0
2)Вкомплекте я заметил AutoIT Window Info, там есть такой замечательный объект который при наведение курсора выдает значения мыши.Можно в мою программку вставить что то на подобии?
3)И как удалить текстбоксы заранее созданные?
 
V

VitAl2013

Гость
1) Я делал перерисовку интерфейса с другими условиями по нажатию кнопки, но там менялась вся форма. Либо можно гасить (хайдить) элементы и показывать при нажатии. Ещё вариант это потом делать мув на элементы, опять же через условие (if, switch ... и т.д.)
2) "значения мыши" - это что имеется ввиду? координаты?
3) Удалить - по моему никак без перерисовки. А скрыть - ControlHide.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
warshadow [?]
2)Вкомплекте я заметил AutoIT Window Info, там есть такой замечательный объект который при наведение курсора выдает значения мыши.Можно в мою программку вставить что то на подобии?

Вот это подойдет ?
Код:
#include <WindowsConstants.au3> 
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("Test GUI_EVENT_MOUSEMOVE", 400, 500)
GUISetState(@SW_SHOW ,$hGUI)

$Exit_Button = GUICtrlCreateButton("Exit", 330, 470, 60, 20)

;$hPopup=GUICreate("t", 300, 50,0,0,$WS_POPUP,$WS_EX_MDICHILD,$hGUI)
;$hLabel=GUICtrlCreateLabel ( "", 5, 5 ,290, 40) 
 $hPopup=GUICreate("t", 220, 40, 100,-70,$WS_POPUP+$WS_BORDER,$WS_EX_MDICHILD,$hGUI)
$hLabel=GUICtrlCreateLabel ( "", 5, 5 ,210, 40)

GUISetState(@SW_SHOW ,$hPopup)  
	
   While 1
	  $nMsg = GUIGetMsg()
	   
	  Switch $nMsg
		 Case -3, $Exit_Button
			Exit
		 Case $GUI_EVENT_MOUSEMOVE
			$aCur_Info = GUIGetCursorInfo($hGUI)
			GUICtrlSetData (  $hLabel,'X = ' & $aCur_Info[0]& @LF & 'Y = ' & $aCur_Info[1]) 
		 Case $GUI_EVENT_SECONDARYDOWN
			ClipPut('X = ' & $aCur_Info[0]& @LF & 'Y = ' & $aCur_Info[1])
			GUICtrlSetData (  $hLabel,'Координаты :' & @Tab & 'X = ' & $aCur_Info[0] & @Tab & ',' & @Tab & 'Y = ' & $aCur_Info[1] &  @CRLF & "Занесены в буфер !") 
	  EndSwitch
   WEnd


Чтобы не заслонять свое основное окно можно поднять окно информации так :
Код:
$hPopup=GUICreate("t", 220, 40, 100,-70,$WS_POPUP+$WS_BORDER,$WS_EX_MDICHILD,$hGUI)
$hLabel=GUICtrlCreateLabel ( "", 5, 5 ,210, 40)

Здесь определялись координаты скриптового окна
Если надо определять общие координаты , то вместо :
Код:
$aCur_Info = GUIGetCursorInfo($hGUI)
Надо взять : 
$aCur_Info = GUIGetCursorInfo()
А вообще-то лучше вместо :
Код:
GUIGetCursorInfo()
взять
MouseGetPos()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
GUIGetCursorInfo() работает только с AutoIt окнами. Нужно использовать MouseGetPos() или аналог из WinAPI.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
gregaz [?]
А вообще-то лучше вместо :
Код: [Выделить]GUIGetCursorInfo()
взять
MouseGetPos()

Конечно, я это уже понял

Привожу вариант , легко встраиваемый в любой скрипт :
Код:
#include <WindowsConstants.au3> 
   #include <GUIConstantsEx.au3>
   
   Global $Height=1000
   Global $hLabel
  
   $hGUI = GUICreate("Test GUI_EVENT_MOUSEMOVE", $Height, 500,300,300)
   
   $Exit_Button = GUICtrlCreateButton("Exit", 10, 470, 60, 20)

   GUISetState(@SW_SHOW ,$hGUI)
   InfoWindowCreate($hGUI) ; ====>
    
   While 1
      $nMsg = GUIGetMsg()
	  GetMouseCoordinates($nMsg) ; ====>
      Switch $nMsg
         Case $GUI_EVENT_CLOSE, $Exit_Button
            Exit
   
	  EndSwitch 
   WEnd
   
   Func InfoWindowCreate($hWnd)
	  $hPopup=GUICreate("t", 220, 40,$Height/2 -110,-70,$WS_POPUP+$WS_BORDER,$WS_EX_MDICHILD,$hWnd)
	  GUISetState(@SW_SHOW ,$hPopup)  
	  $hLabel=GUICtrlCreateLabel ( "", 5, 5 ,210, 40)
   EndFunc
   
   Func GetMouseCoordinates($nEventMsg)
	  $aMousePos = GUIGetCursorInfo( $hGUI) ;  Для определения координат курсора мыши относительно окна , созданного AutoIt ($hGUI)
	  ; $aMousePos = MouseGetPos() 			 ; Для определения абсолютных координат курсора мыши
	  Switch $nEventMsg
		 Case $GUI_EVENT_MOUSEMOVE
			GUICtrlSetData (  $hLabel,'X = ' & $aMousePos[0]& @LF & 'Y = ' & $aMousePos[1]) 
         Case $GUI_EVENT_SECONDARYDOWN ; Запоминание в буфер (кликом правой кнопки мыши)
			ClipPut('X = ' & $aMousePos[0]& @LF & 'Y = ' & $aMousePos[1])
            GUICtrlSetData (  $hLabel,'Координаты :' & @Tab & 'X = ' & $aMousePos[0] & @Tab & ',' & @Tab & 'Y = ' & $aMousePos[1] &  @CRLF & "Занесены в буфер !") 
	  EndSwitch
   EndFunc
 
Автор
W

warshadow

Новичок
Сообщения
62
Репутация
0
За Finder Tool всем огромное спасибо!)) разобрался с ним -- заработал..
А вот по 1)чтобы при нажатии на кнопку "+" добавлялись 2 текстбокса, в дальнейшем для ввода координат мыши x и y все таки не получилось..
Наверное приедеться привязать текстбоксы....
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Вот такой вот простой примерчик: (малость исправил, глюки нашлись)
Код:
#include <GUIConstants.au3>
$Form1 = GUICreate("БОТ ", 420, 213, 518, 254)
$Label1 = GUICtrlCreateLabel("Количество заходов", 32, 24, 107, 17)
$txtN = GUICtrlCreateInput("", 160, 24, 145, 21)
$cmdRun = GUICtrlCreateButton("Ботить!", 152, 88, 89, 33, 0)
$plus  = GUICtrlCreateButton("+", 152, 140, 89, 33, 0)
$cmdCLose = GUICtrlCreateButton("Завершить", 296, 192, 121, 17, 0)
$vibr1 = 0
$vibr2 = 0
$x = 0
$y = 0
GUISetState(@SW_SHOW)
HotKeySet("s", "stop1")    ; Call function test() on ctrl+alt+d
Func stop1 ()
    Exit()
    EndFunc

While 1
        $nMsg = GUIGetMsg()
            Switch $nMsg
				Case $GUI_EVENT_CLOSE
            Exit
                       
				Case $cmdRun
					Call("start")				
				Case $cmdCLose
					Exit
                       
				Case $plus				
					$vibr1 = GUICtrlCreateInput("", 1, 10,30 ,15)
					$vibr2=GUICtrlCreateInput("", 40, 10, 30, 15)               
    EndSwitch
WEnd

Func start () 
	If   $vibr1>0 And $vibr2>0 Then
		$x = GUICtrlRead ( $vibr1 )
		$y = GUICtrlRead ( $vibr2 )					
		MsgBox(64, "Координаты", $x & " / " & $y)
		MouseClick("left", $x, $y)
		GUICtrlDelete ($vibr1)
		GUICtrlDelete ($vibr2)
		$vibr1 = 0
		$vibr2 = 0
	Else
		MsgBox(64, "Ботить", "Сделать чего-то " & GUICtrlRead($txtN) & " раз")
	EndIf
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
warshadow [?]
чтобы при нажатии на кнопку "+" добавлялись 2 текстбокса, в дальнейшем для ввода координат мыши x и y все таки не получилось..
Причина в том , что все вновь добавляемые Контролы должны быть объявлены , как глобальные

Показываю на работающем примере занесения координат в Input'ы:
Код:
#include <GUIConstants.au3>

Global $idCoord_X,$idCoord_Y,$i

$Form1 = GUICreate("БОТ ", 420, 213, 518, 254)
GUICtrlCreateLabel("Количество заходов", 32, 24, 107, 17)
$idSettings= GUICtrlCreateInput("", 160, 24, 145, 21)
$btPlus  = GUICtrlCreateButton("+", 152, 140, 89, 33)
$cmdCLose = GUICtrlCreateButton("Выход", 350, 192, 70, 20)

GUISetState(@SW_SHOW)

While 1
   $nMsg = GUIGetMsg()
   GetMouseCoordinates($nMsg) ; ====>
   Switch $nMsg
      Case $GUI_EVENT_CLOSE,$cmdCLose
         ExitLoop     
      Case $btPlus              
         $idCoord_X = GUICtrlCreateInput("", 1, 10,30 ,15)
		 $idCoord_Y = GUICtrlCreateInput("", 40, 10, 30, 15)               
    EndSwitch
WEnd

Func GetMouseCoordinates($nEventMsg)
   Switch $nEventMsg
      Case $GUI_EVENT_MOUSEMOVE
         $aMousePos = MouseGetPos()
		 GUICtrlSetData (  $idCoord_X,$aMousePos[0]) 
         GUICtrlSetData (  $idCoord_Y,$aMousePos[1])
      Case $GUI_EVENT_PRIMARYDOWN ; При клике левой кнопки мыши
         $i+=1 ; Количество заходов
         GUICtrlSetData (  $idSettings,$i) 
   EndSwitch
EndFunc
 
Автор
W

warshadow

Новичок
Сообщения
62
Репутация
0
Все конечно хорошо работает, но от AutoIT Window Info есть разница, координаты не четкие ((
Делал относительно окна, более менее похожие,но все равно не так( а про координату по окну я вообще молчу
И что вы мне можете еще подсказать?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
warshadow
незачем цитировать все сообщение. достаточно ключевые, на которые хочется дать ответ
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
warshadow [?]
Все конечно хорошо работает, но от AutoIT Window Info есть разница, координаты не четкие ((

Они не могут быть "нечеткими" в принципе.

Просто AutoIT Window (В зависимости от выбранной Option) при попадании на любой элемент или окно начинает показывать координаты относительно клиентской области элемента , окна.и т.п.

Этот же скрипт при MouseGetPos() показывает только абсолютные координаты.
При использовании GUIGetCursorInfo() он покажет координаты относительно начала клиентской области GUI окна скрипта.
Они совпадают при проверке на чистом Desktop'е (без открытых окон)



Добавлено:
Сообщение автоматически объединено:

warshadow [?]
И что вы мне можете еще подсказать?

Встречный вопрос.А тебя какие координаты интересуют ?
 
Автор
W

warshadow

Новичок
Сообщения
62
Репутация
0
Встречный вопрос.А тебя какие координаты интересуют ?
Меня интересуют координаты относительно браузера - Moziila Firefox а именно Flash-приложения, AutoIT Window - я беру да clientа.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
warshadow [?]
Меня интересуют координаты относительно браузера - Moziila Firefox

Тогда так :
Код:
#include <WinAPI.au3>
;....................................

; ...................................................
Func GetMouseCoordinates($nEventMsg)
   Switch $nEventMsg
      Case $GUI_EVENT_MOUSEMOVE
		 $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
		 $tPoint = _WinAPI_GetMousePos(True, $aRet[0])
		 $X=DllStructGetData($tPoint, "X") 
		 $Y= DllStructGetData($tPoint, "Y")
		 GUICtrlSetData (  $idCoord_X,$X) 
		 GUICtrlSetData (  $idCoord_Y,$Y)
      Case $GUI_EVENT_PRIMARYDOWN ; При клике левой кнопки мыши
		 $i+=1 ; Количество заходов
         GUICtrlSetData (  $idSettings,$i) 
   EndSwitch
EndFunc




Добавлено:
Сообщение автоматически объединено:

А еще посмотри Здесь : Пример отлова и подсвечивания элементов под курсором
 
Автор
W

warshadow

Новичок
Сообщения
62
Репутация
0
Хм..странно вставил, бывает ошибку выдает около:
Код:
GUICtrlSetData  (  $idCoord_X,$X)
         GUICtrlSetData (  $idCoord_Y,$Y)

И не показывает координаты..((
И еще такой вопрос созрел, я пошел не много другим путем, взял привязал к текстобоксам координаты и естно считываю их,вот такой кодик получилось:

Код:
$vibr1 = GUICtrlCreateInput("", 1, 30,30,15)
$vibr2=GUICtrlCreateInput("", 40, 30, 30, 15)
$vibr3 = GUICtrlCreateInput("", 1, 50,30,15)
$vibr4=GUICtrlCreateInput("", 40, 50, 30, 15)
$vibr5 = GUICtrlCreateInput("", 1, 70,30,15)
$vibr6=GUICtrlCreateInput("", 40, 70, 30, 15)
.
.
.
;vibrnN=GUICtrlCreateInput("", n, n, n, n)
Case $cmdRun
			            $x=GUICtrlRead($vibr1)
						$y=GUICtrlRead($vibr2)
						$x1=GUICtrlRead($vibr3)
						$y1=GUICtrlRead($vibr4)
						$x2=GUICtrlRead($vibr5)
						$y2=GUICtrlRead($vibr6)
						.....
sleep(5000)
						AutoItSetOption ( "MouseClickDelay", 40 )
						MouseClick("left", $x1, $y1, 10)
					sleep(5000)
						AutoItSetOption ( "MouseClickDelay", 40 )
						MouseClick("left", $x2, $y2, 10)
					sleep(5000)
						AutoItSetOption ( "MouseClickDelay", 40 )
						MouseClick("left", $x3, $y3, 10)
					sleep(5000)
						AutoItSetOption ( "MouseClickDelay", 40 )
						MouseClick("left", $x4, $y4, 10)
case $minus2
													$n=$n+1
													For $i=0 to $n
														If $i=1 Then
													ControlHide("","",$vibr1)
													ControlHide("","",$vibr2)
													Elseif $i=2 Then
													ControlHide("","",$vibr3)
													ControlHide("","",$vibr4)
													Elseif $i=3 Then 
													ControlHide("","",$vibr5)
													ControlHide("","",$vibr6)

Все работает, НО получается что :
Код:
ControlHide("","",$vibr1)
ControlHide("","",$vibr2)

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

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
warshadow [?]
И не показывает координаты..((
У меня все показывает на любом окне и совпадает с AutoIT Window Info .

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

Совсем не рациональный путь скрыванием окон. Зачем ?
Сделай последовательное разрешение на чтение из окон и все.Типа :
Код:
;..............................
Case $cmdRun
                       
   For $i=0 to $n
	  If $i >= 1 Then
		 $x=GUICtrlRead($vibr1)
		 $y=GUICtrlRead($vibr2)
	  ElseIf  $i>=2 Then
		 $x1=GUICtrlRead($vibr3)
		 $y1=GUICtrlRead($vibr4)
	  ElseIf  $i>=3 Then
		 $x2=GUICtrlRead($vibr5)
		 $y2=GUICtrlRead($vibr6)
		 ;........................
	  EndIf
   Next






Добавлено:
Сообщение автоматически объединено:

Может понадобиться чтобы $n было глобальным. (Объяви в начале скрипта)
 
Верх