Войти

Показать полную графическую версию : [архив - Часть 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

Endr
25-12-2007, 07:18
Помогите пжалста...
Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?

Creat0R
25-12-2007, 07:27
Endr,
Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?
Несколько методов:


$MyScript = '"C:\My Script.vbs"'

;1)
Run("wscript.exe " & $MyScript)

;2)
ShellExecute($MyScript)

Хотя наверняка проще переписать всё то, что делает vbs скрипт, на AutoIt.

Endr
25-12-2007, 08:39
Creat0R, будьте добры, подскажите пжалста как установить в Windows XP службу, с последующим запуском данной службы. В справке AutoIt я этого не нашел... (или может ссылочку туда, где это обсуждается) :help:

ЗЫ: Creat0R, описанные Вами способы не помогли запустить скрипт *.vbs :(

Creat0R
25-12-2007, 09:40
Endr,
как установить в Windows XP службу, с последующим запуском данной службы.
Я этого не знаю :( , никогда не сталкивался.

описанные Вами способы не помогли запустить скрипт *.vbs
Что происходит при попытке? а при обычном запуске (кликом по файлу) нормально запускается?

Endr
25-12-2007, 10:50
Если кликнуть по файлу *.vbs, то скрипт запускается, а если через описанные выше способы (через скрипт AutoIt) вообще ничего не происходит... (и почему-то с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется :( )

Извиняюсь, что не цитирую, что-то не получается тут это использовать на этом компьютере..

Creat0R
25-12-2007, 11:12
Endr,
ничего не происходит
А такой скрипт работает:

MsgBox(0, "", "Hello World!")

:)

с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется
Иконка спрятана? (в настройках панели задач).

Endr
25-12-2007, 11:53
Creat0R, да, окошко появляется :)
Да дело не в компьютере... мои-то скрипты работают.
Тут видимо не так надо запускать vbs-файлик...

Creat0R
25-12-2007, 16:33
Endr,
видимо не так надо запускать vbs-файлик
Я очень редко советую что-то, не проверив на себе, если не тестировал, то так и напишу - “Не тестировано”.

У меня оно работает нормально, вопрос возможно глупым покажется, но всё же; как определяется что скрипт (vbs) не запускается?

Endr
26-12-2007, 08:03
Creat0R, у меня есть скрипт на VBS, который подкидывает файлики, устанавливает и запускает службу в Винде и потом удаляет все, что для этого требуется и себя. Определить работает скрипт или нет очень просто - служба запускается (если она выключена) и потом файлы удаляются...
Все это нужно для установки Радмина (тот скрипт, который я нашел в интернете делает это видимо, а мой - скрытно).
В данный момент у меня половина написана на AutoIt (это распаковка файлов для установки, в т.ч. и скрипт на VBS), а остальное делает собственно скриптик VBS.
Могу прикрепить код.

Creat0R
26-12-2007, 08:19
Endr,
Можно попробовать указать рабочую папку:

ShellExecute($MyScript, "", "C:\")

[hr]

amel27

Такой вопрос - накалякал функцию (на основе других подобных) для проверки пути, не является ли он запущенным процессом, всё вроде работает (возвращает PID процесса), но вопрос в том, насколько надёжно использовать Psapi.dll? :shuffle: - в справке по этому поводу вот что сказанно:

psapi.dll - Process...() function helper DLL - used under Windows NT 4 only (Microsoft redistributable file)

Т.е получается на других системах работать не будет?

Вот функция:


$PathIsProcess = _PathIsProcess("C:\Program Files\qip\qip.exe")
MsgBox(0, '', $PathIsProcess & @LF & @extended)

Func _PathIsProcess($sPath)
If Not FileExists($sPath) Then Return SetError(1, 0, False)

Local $sPathName = StringRegExpReplace($sPath, "^.*\\", "")
Local $aProcList = ProcessList($sPathName)

If Not ProcessExists($sPathName) Then Return SetError(2, 0, False)
Local $iUbound = UBound($aProcList)-1

Local $aProc, $aPath
Local $vStruct = DllStructCreate('int[1024]')

For $i = 1 To $iUbound
$aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])
If Not IsArray($aProc) Or Not $aProc[0] Then Return SetError(3, 0, False)

DllCall('Psapi.dll', 'int', 'EnumProcessModules', _
'hwnd', $aProc[0], _
'ptr', DllStructGetPtr($vStruct), _
'int', DllStructGetSize($vStruct), _
'int_ptr', 0)

$aPath = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', _
'hwnd', $aProc[0], _
'int', DllStructGetData($vStruct, 1), _
'str', '', _
'int', 2048)
If IsArray($aPath) And $aPath[3] = $sPath Then Return SetExtended($iUbound, $aProcList[$i][1])
Next

Return SetExtended($iUbound, False)
EndFunc

Может есть альтернативы?

Endr
26-12-2007, 08:59
Creat0R, указал рабочую папку и запустился VBS-скрипт. Спасибо! :up

Maza Faka
27-12-2007, 09:31
Creat0R
Привет! Не поможешь?
Никак не получается убить процесс средствами WinAPI

#include <Array.au3>

Process_Kill("totalcmd.exe")

Func Process_Kill($sProc)
Local $ProcHandle
Local $ProcessPid = ProcessExists($sProc)
If $ProcessPid = 0 Then
MsgBox(16, "Error", "Process " & $sProc & " not exist")
Return SetError(1)
EndIf

$ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", BitOR(0x0400, 0x0004), "int", 0, "dword", $ProcessPid)

If $ProcHandle[0] = 0 Then
MsgBox(16, "Error", "Process " & $sProc & " not exist")
Return SetError(1)
EndIf

$ProcHandle = $ProcHandle[0]

$ProcTerminate = DllCall("kernel32.dll", "int", "TerminateProcess", "hwnd", $ProcHandle, "uint", "?")

$CloseHandle = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
ConsoleWrite("@@ (6) : " & $CloseHandle[0] & " ")
EndFunc

В выделенной строке в место параметра "?", надо вставить uExitCode

The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess [ http://msdn2.microsoft.com/en-us/library/ms683189(VS.85,printer).aspx ] function to retrieve a process's exit value. Use the GetExitCodeThread [ http://msdn2.microsoft.com/en-us/library/ms683190(VS.85,printer).aspx ] function to retrieve a thread's exit value.

GetExitCodeProcess Function


Retrieves the termination status of the specified process.
BOOL WINAPI GetExitCodeProcess(
__in HANDLE hProcess,
__out LPDWORD lpExitCode
);
Parameters
hProcess

A handle to the process.

The handle must have the PROCESS_QUERY_INFORMATION access right. For more information, see Process Security and Access Rights [ http://msdn2.microsoft.com/en-us/library/ms684880(VS.85,printer).aspx ] .
lpExitCode

A pointer to a variable to receive the process termination status. If the specified process has not terminated and the function succeeds, the status is STILL_ACTIVE.

Как я понял нужно создать структуру Dll, а вот как её создать?

Creat0R
27-12-2007, 10:39
Maza Faka, В выделенной строке в место параметра "?", надо вставить
Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess ... если я не ошибаюсь... у меня тоже не получается заставить это работать, либо скрипт крушится, либо процесс не убивается. DLL-о-писание видимо будет доходить (до меня по крайней мере) долго, т.к мануалов по этой теме вроде нету, я имею в виду именно для использования в AutoIt, а так приходится включать интуицию/способности "тыкания" :).

На оф. форуме решения тоже нет, там ссылаются на C/C++, а на AutoIt перевести видимо ленятся :biggrin:

Maza Faka
27-12-2007, 10:55
Creat0R
Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess
Это понятно, что нужно указать pointer, а вот как его создать? (amel27 где ты гуру?) :)

а так приходится включать интуицию/способности "тыкания"
Вот-вот, всё утро на это убил... :(

P.S.
Если вдруг наткнёшься на решение, сообщи пожалуйста.

Maza Faka
27-12-2007, 13:11
Ура! :) Нашёл, вернее указали (http://www.autoitscript.com/forum/index.php?showtopic=60417&view=findpost&p=454378) на ошибку. А ошибочное значение из недобросовестного ресурса, уже не помню какого.

Creat0R
28-12-2007, 07:53
Функция возвращает пронумерованный список всех классов определённого окна:

Func _WinGetNumeratedClassList($sTitle)
Local $sClassList = WinGetClassList($sTitle)
Local $aClassList = StringSplit($sClassList, @LF)
Local $sRetClassList = "", $sHold_List = "|"
Local $aiInHold, $iInHold

For $i = 1 To UBound($aClassList) - 1
If $aClassList[$i] = "" Then ContinueLoop

If StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
$aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
$iInHold = Number($aiInHold[UBound($aiInHold)-1])

If $iInHold = 0 Then $iInHold += 1

$aClassList[$i] &= "~" & $iInHold + 1
$sHold_List &= $aClassList[$i] & "|"

$sRetClassList &= $aClassList[$i] & @LF
Else
$aClassList[$i] &= "~1"
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @LF
EndIf
Next

Return StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc

Creat0R
30-12-2007, 03:14
amel27,

Не удаётся в новой версии AutoIt 3.2.10.0 переделать самопальную функцию _FileSelectFolder() - хотел избавиться от CallBack UDF'ов, соответственно использовать встроенные функции, но при запуске скрипт намертво виснит, диалога невидно вовсе :(

Я заменил...

_DllCallBack($sCallbackProc,'hwnd;uint;long;ptr')

на

DllCallBackRegister($sCallbackProc, 'int', 'hwnd;uint;long;ptr')

А также _DllCallBack_Free на DllCallBackFree

И убрал все UDF'ы/переменные/константы от библиотеки CallBack, но видимо нужно что-то ещё править, подскажи плиз что именно, у меня многие скрипты используют эту функцию, я затрудняюсь теперь пересесть на новую версию :help: .

МИШАНЧИК
01-01-2008, 15:25
Никто не пробовал написать скрипт для Nero 8? А то втихую не получается, требует перезагрузку даже при включенном автоматическом обновлении. Может кто попробует, у кого время есть?
Заранее спасибо!

kagorec
01-01-2008, 23:51
Хорошо пополняются посты в этом топике =)

Помогите реализовать корректно работающий скрипт с тикими требованиями:
Лечилка для одной RPG игры. Все происходит в разрешении 1024х786

1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?

Поискал по форуму здесь и на офф. сайте вот нашел скрипт но в нем часть задумки реализована. Кстати он неработает тоесть не нажимает на кнопки.

Opt("WinTitleMatchMode", 1)

HotKeySet("{F5}", "Start")

While 1
Sleep(10)
WEnd

Func Start()
MsgBox(0,"","Start() triggered")
$left = PixelChecksum(380, 420, 400, 400)
ConsoleWrite($left & @CRLF)
$down = PixelChecksum(450, 420, 470, 400)
ConsoleWrite($down & @CRLF)
$up = PixelChecksum(520, 420, 535, 410)
ConsoleWrite($up & @CRLF)
$right = PixelChecksum(590, 415, 585, 400)
ConsoleWrite($right & @CRLF)
While 1
If $left <> PixelChecksum(380, 420, 400, 400) Then Send("q")
If $down <> PixelChecksum(450, 420, 470, 400) Then Send("e")
If $up <> PixelChecksum(520, 420, 535, 410) Then Send("w")
If $right <> PixelChecksum(590, 415, 585, 400) Then Send("t")
WEnd
EndFunc

Maza Faka
02-01-2008, 08:44
kagorec
С Новым Годом!

1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
В принципе написать такой скрипт несложно, в топике есть примеры.

2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
Смотри в справке MouseDown()

3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?
Можно после запуска игры определять глубину цвета рабочего стола @DesktopDepth и в зависимости от результата передавать значение в функцию.




© OSzone.net 2001-2012