PDA

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Maza Faka
05-11-2007, 08:45
MaxxQ

$checksum = PixelChecksum(0,0, 50,50)

While $checksum <> 1111111111
$checksum = PixelChecksum(0,0, 50,50)
Send("{x}")
Sleep(500)
WEnd

Send("{z}")

В справке это есть.

TERMINAL
05-11-2007, 09:33
После компилировании в *.exe файл и старте его, возможно ли сделать этот файл невидимым процессом в диспетчере задач?

Creat0R
05-11-2007, 10:43
TERMINAL,
возможно ли сделать этот файл невидимым процессом в диспетчере задач?
Полностью невидемым не уверен, но можно сделать что-то в этом роде:

#include <A3LListView.au3>

$Process = "AutoIt3.exe"
$TaskMgr_Title = "Диспетчер задач Windows"
$TaskMgr_LV_hWnd = ControlGetHandle($TaskMgr_Title, "", "SysListView321")

While 1
Sleep(100)
$TaskMgrActiveMark = 0

While Not BitAND(WinGetState($TaskMgr_Title), 2)
Sleep(100)
$TaskMgrActiveMark = 1
WEnd

If $TaskMgrActiveMark = 1 Then
$TaskMgr_LV_hWnd = ControlGetHandle($TaskMgr_Title, "", "SysListView321")
ControlSend($TaskMgr_Title, "", "", "{Alt}{Right 2}{Down 2}{Right}{Up}{Enter}")
EndIf

$Index = _ListView_FindText($TaskMgr_LV_hWnd, $Process, -1, False)
If $Index = -1 Then ContinueLoop
_ListView_DeleteItem($TaskMgr_LV_hWnd, $Index)
WEnd

Требуется библиотека A3LLibrary.

[hr]

О, вот метод попроще (кажется amel27 его написал):

HotKeySet("{Esc}", "Quit")

$ProcName = "AutoIt3.exe"
HideProcess("Диспетчер задач Windows", $ProcName)

Func HideProcess($TaskManTitle, $ProcName)
Local $FindIndex, $hwnd
While 1
$FindIndex = ControlListView($TaskManTitle, "", 1009, "FindItem", $ProcName)
If $FindIndex = -1 Then
Sleep(5)
Else
$hwnd = ControlGetHandle($TaskManTitle, "", 1009)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwnd, "int", 0x1008, "int", $FindIndex, "int", 0)
EndIf
WEnd
EndFunc

Func Quit()
Exit
EndFunc

MaxxQ
05-11-2007, 17:03
Maza Faka спасибо большое, а как сделать что бы после выполнения Send("{z}"), продолжить выполнение сценария, т.е сейчас пока не найдено заначение 1111111111 выполняется Send("{x}"), а при верном значении выполняется Send("{z}") и все скрипт закрывается, а мне нужно что бы Send("{z}") выполнялось до тех пор, пока значение опять станет неверным и начнется ваполнение Send("{x}"), подскажите пожалуйста.

MaxxQ
05-11-2007, 18:01
Извините за глупые вопросы ( я дуб дубом в написании скриптов :)), но вот при выполнении сценария который постил выше Maza Faka, при появлении в области (0,0, 50,50) значения 1111111111, еще раз выполняется команда Send("{x}"), а уже потом Send("{z}") ( это хорошо видно если установить значение Sleep(10000)), а как сделать что бы при появлении в области значения 1111111111 следующая команда была нужно т.е Send("{z}") (а не ждать выполнения Send("{x}"), когда уже область изменена на выполнение Send("{z}"))???????
p.s надеюсь не слишком запутанно написал :)

Maza Faka
05-11-2007, 18:19
MaxxQ
Попробуй так:

HotKeySet("{Esc}", "ExitFunc")

$checksum = PixelChecksum(0, 0, 50, 50)

SendX()

Func SendX()
While 1
$checksum = PixelChecksum(0,0, 50,50)
If $checksum = 1111111111 Then ExitLoop
Send("{x}")
Sleep(500)
WEnd
SendZ()
EndFunc

Func SendZ()
While 1
If $checksum <> 1111111111 Then ExitLoop
$checksum = PixelChecksum(0,0, 50,50)
Send("{z}")
Sleep(500)
WEnd
SendX()
EndFunc

Func ExitFunc()
Exit
EndFunc

MaxxQ
05-11-2007, 19:06
Спасибо Maza Faka

А как сделать что бы нажатие клавиш было по одному разу (изменилась область на 1111111111 один раз нажатие Send("{x}") , изменилось на другое один раз Send("{z}") и т.д ,а не постоянное нажатие.?????

ну подскажите пожалуйста кто нибудь

kagorec
05-11-2007, 22:06
Как реализовать скрипт чтоб курсор двигался по кругу диаметром 100пиксел и во время движения курсора неприрывно кликалась правая кнопка мыши
У меня получается либо только движение либо только кликание правой кнопкой.
Тоесть ненадо пооочереди, а сразу синхроннно движение по кркгу и кликание правой кнопкой.

Creat0R
06-11-2007, 02:11
kagorec,
Как реализовать скрипт чтоб курсор двигался по кругу диаметром 100пиксел и во время движения курсора неприрывно кликалась правая кнопка мыши

Кликания правой кнопкой могут вызывать проблемы в некоторых случаях, вот пример с движением мышки по кругу и зажатие левой кнопки мышки (рисует круг в MSPaint):

$MsPaintPid = Run("mspaint")
ProcessWait($MsPaintPid)
WinActivate("[CLASS:MSPaintApp]")

_MouseMoveCircle(220, 180, 100, 625, 1)

Func _MouseMoveCircle($xPos, $yPos, $Radius, $TimeExp, $MouseClick=0); x coord, y coord, radius, time to loop (milliseconds)
Local $TimeInit = TimerInit()
Local $xPosMov, $yPosMov
Local $MouseClick_Mark = 1

Do
$TimeDiff = TimerDiff($TimeInit)
$xPosMov = $xPos + ($Radius * Sin($TimeDiff/100))
$yPosMov = $yPos + ($Radius * Cos($TimeDiff/100))
MouseMove($xPosMov, $yPosMov, 1)
If $MouseClick_Mark = 1 And $MouseClick <> 0 Then MouseDown("Left")
$MouseClick_Mark = 0
Until $TimeDiff > $TimeExp
If $MouseClick <> 0 Then MouseUp("Left")
EndFunc

Чтобы поменять кнопку на правую нужно заменить “Left” на “Right” ;)

Maza Faka
06-11-2007, 07:17
MaxxQ
Вот если бы не ленился заглядывать в справку, то уже давно нашёл бы решение такой простой задачки ;)

HotKeySet("{Esc}", "ExitFunc")

SendX()

Func SendX()
While 1
$checksum = PixelChecksum(0,0, 50,50)
If $checksum = 1111111111 Then
Send("{x}")
ExitLoop
EndIf
Sleep(100)
WEnd
SendZ()
EndFunc

Func SendZ()
While 1
$checksum = PixelChecksum(0,0, 50,50)
If $checksum <> 1111111111 Then
Send("{z}")
ExitLoop
EndIf
Sleep(100)
WEnd
SendX()
EndFunc

Func ExitFunc()
Exit
EndFunc

MaxxQ
06-11-2007, 08:17
Спасибо Maza Faka , но у меня опять грабли, и в связи с этим несколько вопросов, при выполнении твоего сценария когда $checksum <> 1111111111 происходит нажатие клавиши Z, но вот после когда область изменяется опять на $checksum <> 1111111111 не происходит нажатие клавиши Z, я имею ввиду что мне нужно что бы при каждом изменении области которая будет $checksum <> 1111111111 происходило нажатие Z(один раз) , а если значение становилось $checksum = 1111111111 тогда уже X(один раз), если опять $checksum = 1111111111 опять X и т.д

И еще вопрос можно ли добавить не одно значение - 1111111111, а еще 2222222222, 3333333333 и т.д, при появление которых будет выполнятся X.

Подскажите как такая функция будет выглядеть ??? Спасибо

P.s пытаюсь читать справку нехрена пока не понимаю :(

Creat0R
06-11-2007, 09:14
Рисуем смайлик http://files.myopera.com/Creat0R/Opera_AC/Icons/Kolobki/crazy.gif

$MsPaintPid = Run("mspaint")
ProcessWait($MsPaintPid)
WinActivate("[CLASS:MSPaintApp]")
WinWaitActive("[CLASS:MSPaintApp]")

BlockInput(1)
_MouseMoveCircle(220, 180, 100, 625, 1) ;Лицо
Sleep(200)
_MouseMoveCircle(180, 155, 100, 100, 1) ;Улыбка (кривая :D)
Sleep(400)
_MouseMoveCircle(175, 140, 20, 625, 1) ;Левый глаз
Sleep(20)
_MouseMoveCircle(260, 140, 20, 625, 1) ;Правый глаз
Sleep(400)
_MouseMoveCircle(182, 145, 10, 625, 1) ;Зрачёк левого глаза
Sleep(20)
_MouseMoveCircle(268, 145, 10, 625, 1) ;Зрачёк правого глаза
BlockInput(0)

Func _MouseMoveCircle($xPos, $yPos, $Radius, $TimeExp, $MouseClick=0); x coord, y coord, radius, time to loop (milliseconds)
Local $TimeInit = TimerInit()
Local $xPosMov, $yPosMov
Local $MouseClick_Mark = 1

Do
$TimeDiff = TimerDiff($TimeInit)
$xPosMov = $xPos + ($Radius * Sin($TimeDiff/100))
$yPosMov = $yPos + ($Radius * Cos($TimeDiff/100))
MouseMove($xPosMov, $yPosMov, 1)
If $MouseClick_Mark = 1 And $MouseClick <> 0 Then MouseDown("Left")
$MouseClick_Mark = 0
Until $TimeDiff > $TimeExp
If $MouseClick <> 0 Then MouseUp("Left")
EndFunc


P.S
Функция немного подправлена и в предыдущем моём примере, там переменная для отметки не сбрасывалась.

Maza Faka
06-11-2007, 12:00
MaxxQ
Может во время работы скрипта ты нажимаешь клавишу Esc и скрипт завершает работу? Попробуй заменить клавишу Esc на какое нибудь сочетание клавиш, например:

HotKeySet("^!a", "ExitFunc") ;Ctrl + Alt + a

К сожалению я не могу проверить работу скрипта с контрольной суммой пикселов, но можно немного изменить скрипт (принцип работы остаётся таким же) :

HotKeySet("^!a", "ExitFunc")

$title = "Безымянный - Блокнот"

SendX()

Func SendX()
While 1
If WinExists($title) Then
ConsoleWrite("X")
ExitLoop
EndIf
Sleep(100)
WEnd
SendZ()
EndFunc

Func SendZ()
While 1
If Not WinExists($title) Then
ConsoleWrite("Z")
ExitLoop
EndIf
Sleep(100)
WEnd
SendX()
EndFunc

Func ExitFunc()
Exit
EndFunc

В этом скрипте если существует окно с заголовком "Безымянный - Блокнот", то происходит запись символа X в консоль редактора (в данном случае SciTE), происходит выход из цикла и вызывается вторая функция, которая ожидает момента, когда окна с заголовком "Безымянный - Блокнот" не будет (закрыли), производит запись символа Z в консоль, после этого происходит выход из цикла и вызывается первая функция. И так до бесконечности.
Скрипт работает, значит должен работать и с вычислением контрольной суммы пикселов.

добавить не одно значение - 1111111111, а еще 2222222222, 3333333333 и т.д

Func SendX()
While 1
$checksum = PixelChecksum(0,0, 50,50)
Switch $checksum
Case 1111111111
Send("{x}")
ExitLoop
Case 2222222222
Send("{x}")
ExitLoop
Case 3333333333
Send("{x}")
ExitLoop
EndSwitch
Sleep(100)
WEnd
SendZ()
EndFunc

Maza Faka
06-11-2007, 13:48
#include <GUIConstants.au3>
#include <Date.au3>

Dim $hour, $min, $sec

GUICreate("Test", 150, 70, -1, -1, $WS_CLIPSIBLINGS)
$label = GUICtrlCreateLabel("00:00:00", 50, 15, 100, 20)

$begin = TimerInit()
GUISetState()

AdlibEnable("SetTime", 500)

While GUIGetMsg() <> -3
Sleep(10)
WEnd

Func SetTime()
$time = _TicksToTime(Int(TimerDiff($begin)), $hour, $min, $sec)
GUICtrlSetData($label, StringFormat("%02i:%02i:%02i", $hour, $min, $sec))
EndFunc


В коде указанном выше имеется такая проблемка, если нажать и удерживать левую кнопку мыши на заголовке окна, то таймер "замерзает" и не обновляется, пока левая кнопка мыши удерживается. Конечно можно обойти это задействовав UDF _DllCallBack:

#include <GUIConstants.au3>
#include <Date.au3>
#include <DllCallBack.au3>

Global $sTimer, $Dll_Timer, $hour, $min, $sec

GUICreate("Test", 150, 70, -1, -1)
$label = GUICtrlCreateLabel("00:00:00", 50, 15, 100, 20)
$begin = TimerInit()

GUISetState()

Timer()

While 1
Switch GUIGetMsg()
Case -3
_DllCallBack_Free($sTimer)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Dll_Timer)
ExitLoop
EndSwitch
WEnd

Func Timer()
$sTimer = _DllCallBack("SetTime", "hwnd;uint;int;ptr")
$Dll_Timer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 500, "ptr", $sTimer)
$Dll_Timer = $Dll_Timer[0]
EndFunc

Func SetTime($hWnd, $uiMsg, $idEvent, $dwTime)
$time = _TicksToTime(Int(TimerDiff($begin)), $hour, $min, $sec)
GUICtrlSetData($label, StringFormat("%02i:%02i:%02i", $hour, $min, $sec))
EndFunc

, но всё-таки хотелось бы узнать и о других вариантах (если они есть) решения этой проблемки.

MaxxQ
06-11-2007, 16:29
Спасибо Maza Faka что помогаешь разобраться (единственный кто помог)
ESC я не нажимал, сценарий не завершал работу а, а ждал пока область будет изменена с $checksum<> 1111111111 на $checksum = 1111111111, а если область опять изменялась с $checksum<> 1111111111 на $checksum<> 1111111111 нечего не происходит.


Вот по этому скрипту c блокнотом, получается что функция не может быть дважды подряд Z (как я понял) т.е дважды подряд блокнот не может быть закрыт :) (или чета я напутал?)

А у меня не известно когда придет нужная сумма пикселей при которой $checksum= 1111111111 (2222222222, 3333333333 и т.д.) и выполнится Send("{x}")(один раз) , если же сумма будет любой другой Send("{z}")(один раз) каждый раз при обновлении области.

Вообще скрипт нужен для игры в покер на префлопе(не знаю может я велосипед изобретаю?), но функции должны быть такие: при приходе на руки нужных карт AA, KK, QQ и т.д. сумму пикселей которых я знаю (и сам задаю в скрипте, 1111111111, 222222222, 3333333333 и т.д., вообще их будет около 132) происходит нажатие X , а при появлении 29, 48,73 и т.д. где естественно $checksum <> 1111111111, нажатие Z. Все бы хорошо, но в данном скрипте не реализована функция где при каждом обновлении области на $checksum <> 1111111111 происходило бы Send("{z}") (один раз) дважды подряд, трижды и так до бесконечности , ведь неизвестно когда придут карты где $checksum= 1111111111.
Возможно ли это вообще реализовать? и как?? ПОМОГИТЕ :) :) :)

Creat0R
06-11-2007, 16:58
Maza Faka,
хотелось бы узнать и о других вариантах
Я уже поднимал (http://forum.oszone.net/thread-60616-92.html#post588620) подобный вопрос (когда ещё библиотеки DllCallBack не было ;) ), amel27 привёл (http://forum.oszone.net/thread-60616-94.html#post590370) пару хороших примеров).

Maza Faka
07-11-2007, 08:32
MaxxQ
Пробуй:

#include <Array.au3>

HotKeySet("{Esc}", "OnExit")

Global $CardArray[133]
Dim $new_checksum = PixelChecksum(0,0, 50,50)

$CardArray[0] = 132
$CardArray[1] = 1111111111
$CardArray[2] = 2222222222
$CardArray[3] = 3333333333
; И так далее, либо выложи формулу по которой происходит увеличение суммы, тогда можно будет сделать в цикле ;-)

While 1
$checksum = PixelChecksum(0, 0, 50, 50)
If $checksum <> $new_checksum Then
_ArraySearch($CardArray, $checksum, 1)
If @error Then
Send("{z}")
Else
Send("{x}")
EndIf
$new_checksum = PixelChecksum(0,0, 50,50)
EndIf
Sleep(100)
WEnd

Func OnExit()
Exit
EndFunc

infinity78
07-11-2007, 20:11
http://creator-lab.ucoz.ru/AutoIt/AutoItMacroGenerator.zip (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt код.
http://creator-lab.ucoz.ru/AutoIt/ScriptWriter.zip (78 Kb) - Аналог AutoItMacroGenerator.
http://creator-lab.ucoz.ru/AutoIt/API_Help_Rus.zip Русский справочник по API-функциям
http://creator-lab.ucoz.ru/AutoIt/Koda.zip (724 Kb) - Визуализация работы с GUI - аналог Visual Basic.

MaxxQ
07-11-2007, 20:30
ЗАРАБОТАЛА, СПАСИБО Maza Faka

MaxxQ
08-11-2007, 22:06
http://creator-lab.ucoz.ru/AutoIt/Au...oGenerator.zip (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt код.
http://creator-lab.ucoz.ru/AutoIt/ScriptWriter.zip (78 Kb) - Аналог AutoItMacroGenerator.
http://creator-lab.ucoz.ru/AutoIt/API_Help_Rus.zip Русский справочник по API-функциям
http://creator-lab.ucoz.ru/AutoIt/Koda.zip (724 Kb) - Визуализация работы с GUI - аналог Visual Basic. »

полезные проги, спасибо




© OSzone.net 2001-2012