Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
Да в том то и дело, что не хочется его разворачивать. При развернутом окне и SEND замечательно работает »
Дело в том, что если окно неактивно - далеко не факт, что оно среагирует. Например, в моём случае высылка работает, но игра реагирует только после разворачивания (получения фокуса).
Спасибо огромное что отозвались на мой вопрос. Но WinActivate("заголовок нужного окна", "") непомогает, почемуто окно нестановится активным, заголовок окна смотрел в AutoIt v3 Window Info в строке >>>>Window<<<<< Title. Может ещё как небуть можно сделать его активным ???
Цитата CrazyNNM:а как найти имена этих контролов? »
Используя бесплатную утилиту debugbar »
у меня прога отображается в меню выбора панелей, но не запускается =( мож есть какая-то наподобии?
Maza Faka
29-11-2008, 11:19
почемуто окно нестановится активным »
заголовок окна смотрел в AutoIt v3 Window Info »
Какой заголовок показывает AutoIt Window Info?
у меня прога отображается в меню выбора панелей, но не запускается »
Курсором мыши тянешь иконку в виде "прицела" на интересующий тебя объект и смотришь его параметры.
http://www.my-newpage.info/img/debugbar.png
Спасибо огромное что отозвались на мой вопрос. Но WinActivate("заголовок нужного окна", "") непомогает, почемуто окно нестановится активным, заголовок окна смотрел в AutoIt v3 Window Info в строке >>>>Window<<<<< Title. Может ещё как небуть можно сделать его активным ??? »
поробуй комманду, которая дает комманды даже неактивному окну:
ControlSend ( "title", "text", controlID, "string" [, flag] )
Незнаю печему оно нестановится активным, AutoIt Window Info показывает что заголовок "Setup - FOX*Video Converter" но выход из положения нашолся в таком виде ?Код?WinWait("Setup - FOX Video Converter","Setup has finished installing ")?ControlClick("Setup - FOX Video Converter","Setup has finished installing ","TNewCheckListBox1")
Babullika
29-11-2008, 20:34
Здраствуйте ,
Помогите плиз реализовать - нужно если интернет работает больше часа по времени, отключить интернет и проверить отключился ли ... интернет адсл , при отключении надо чтото вроде длл метода так как rasdial "название подключения" /disconnect почемуто невсегда срабатывает
заранее спасибо.
Maza Faka
30-11-2008, 08:20
Babullika
Незнаю, как сработает с ADSL подключением, но с dialup работает:
While 1
If Int(_RASConStat(4) / 1000 / 60) >= 60 Then
$hRASConn = _RasEnumConnections()
If Not @error Then _RasHangUp($hRASConn)
Exit
EndIf
Sleep(1000)
WEnd
; #FUNCTION# ==================================================================================================== ================
; $iFlag:
; 1 - The number of bytes transmitted through this connection or link.
; 2 - The number of bytes received through this connection or link.
; 3 - Total
; 4 - The amount of time, in milliseconds, that the connection or link has been connected.
Func _RASConStat($sFlags = 1)
Local $hRASConn = _RasEnumConnections()
If @error Then Return SetError(1, 0, 0)
$tRAS_STATS = DllStructCreate("dword dwSize;dword dwBytesXmited;dword dwBytesRcved;dword dwFramesXmited;" & _
"dword dwFramesRcved;dword dwCrcErr;dword dwTimeoutErr;dword dwAlignmentErr;" & _
"dword dwHardwareOverrunErr;dword dwFramingErr;dword dwBufferOverrunErr;" & _
"dword dwCompressionRatioIn;dword dwCompressionRatioOut;dword dwBps;dword dwConnectDuration")
DllStructSetData($tRAS_STATS, "dwSize", DllStructGetSize($tRAS_STATS))
$aRet = DllCall("rasapi32.dll", "int", "RasGetConnectionStatistics", _
"hwnd", $hRASConn, _
"ptr", DllStructGetPtr($tRAS_STATS))
If $aRet[0] Then Return SetError(2, 0, 0)
Local $iResult = 0
Switch $sFlags
Case 1
$iResult = DllStructGetData($tRAS_STATS, "dwBytesXmited")
Case 2
$iResult = DllStructGetData($tRAS_STATS, "dwBytesRcved")
Case 3
$iResult = DllStructGetData($tRAS_STATS, "dwBytesXmited") + DllStructGetData($tRAS_STATS, "dwBytesRcved")
Case 4
$iResult = DllStructGetData($tRAS_STATS, "dwConnectDuration")
EndSwitch
Return $iResult
EndFunc ;==>_RASConStat
Func _RasEnumConnections()
Local Const $MAX_PATH = 260
Local Const $RAS_MaxDeviceType = 16
Local Const $RAS_MaxEntryName = 256
Local Const $RAS_MaxDeviceName = 128
Local $tRASCONN, $iCntByte, $iCntConn, $aRet
$tRASCONN = DllStructCreate("dword dwSize;hwnd hRasConn;char szEntryName[" & $RAS_MaxEntryName + 1 & "];" & _
"char szDeviceType[" & $RAS_MaxDeviceType + 1 & "];" & _
"char szDeviceName[" & $RAS_MaxDeviceName + 1 & "];" & _
"char szPhonebook[" & $MAX_PATH & "];" & _
"dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]")
DllStructSetData($tRASCONN, "dwSize", DllStructGetSize($tRASCONN))
$iCntByte = DllStructCreate("dword")
$iCntConn = DllStructCreate("dword")
DllStructSetData($iCntByte, 1, DllStructGetSize($tRASCONN))
$aRet = DllCall("rasapi32.dll", "int", "RasEnumConnections", _
"ptr", DllStructGetPtr($tRASCONN), _
"ptr", DllStructGetPtr($iCntByte), _
"ptr", DllStructGetPtr($iCntConn))
If $aRet[0] Then Return SetError(1, $aRet[0], -1)
If DllStructGetData($iCntConn, 1) < 1 Then Return SetError(2, 0, 0) ;Error: not opened connections
Return DllStructGetData($tRASCONN, "hRasConn")
EndFunc ;==>_RasEnumConnections
Func _RasHangUp($HRASCONN)
$aRet = DllCall("Rasapi32.dll", "int", "RasHangUp", _
"hwnd", $HRASCONN)
Return $aRet[0]
EndFunc ;==>_RasHangUp
CrazyNNM
30-11-2008, 13:39
почему-то не пашет у меня функция
_IEFormSubmit($oForm)
название кнопки я указал правльно, как в дебагере указано....
код
#include <IE.au3>
$sURL = "http://192.168.1.1/"
$oIE = _IECreate($sURL)
$oName = _IEGetObjByName($oIE, "username")
$oPass = _IEGetObjByName($oIE, "password")
$oForm = _IEFormGetObjByName($oIE, "login")
_IEFormElementSetValue($oName, "admin")
_IEFormElementSetValue($oPass, "admin")
_IEFormSubmit($oForm)
И опять вопрос по RegExp'сам :) (не уверен, но вроде это уже обсуждали)...
Пытаюсь сделать универсальную функцию для получения значения ком. строки:
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 -File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'
MsgBox(64, "", _
_GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
_GetCmdLine($CmdLineRaw, "/URL") & @LF & _
_GetCmdLine($CmdLineRaw, "-File"))
Func _GetCmdLine($sCmdLine, $sArgument)
If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")
Local $sRetCmd = StringRegExpReplace($sCmdLine, '(?i).*' & $sArgument & '( |)("|)(.*?)("|)( /| -|$).*$', '\3')
If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")
Return StringStripWS($sRetCmd, 3)
EndFunc
Проблема в том, что если в значении параметра присутствует хоть один (потенциальный) разделитель ком строки (в нашем случае это - или /), то значение обрывается именно на нём, и возвращается уже не целиком. Как и видно на примере выше, в третьем значении (путь к файлу) нехватает «- Name.txt», причину я знаю, там происходит поиск по аргументу, затем поиск кавычки (если есть такова), затем поиск любой строки до... либо закрывающей кавычки, либо одного из разделителей параметров (/ или -), смотря что попадётся первым. Вот именно это мне и нужно исправить, чтобы разделитель определялся только после закрывающей кавычки (если она конечно присутствует, значение может быть и не в кавычках, это указывает юзер).
Creat0R
чтобы разделитель определялся только после закрывающей кавычки »
например так, хотя и этот вариант далек от идеала - имя параметра может оказаться частью значения другого параметра (в кавычках), эти случаи не отслеживаются таким выражением:
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 ^File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'
MsgBox(64, "", _
_GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
_GetCmdLine($CmdLineRaw, "/URL") & @LF & _
_GetCmdLine($CmdLineRaw, "^File"))
Func _GetCmdLine($sCmdLine, $sArgument)
If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")
Local $sRegExp = '(?i)^.*?\Q'& $sArgument &'\E\s*(?:(?:"([^"]*)")|([^"\s]+)).*$'
Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")
Return StringStripWS($sRetCmd, 3)
EndFunc
З.Ы. Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения ;)
amel27, этот вариант далек от идеала - имя параметра может оказаться частью значения другого параметра (в кавычках) »
Можешь показать на примерной строке? у меня что-то то не удалось, твоя функция отлично отрабатывает в любом(?) случае :)
Хотя есть проблема с путями без кавычек, они обрубаются на перевом пробеле :( - Нужно либо до кавычки, либо до разделителя (/ или -).
Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения »
Интересно, оно даже в справке есть, а мы (я?) раньше делали отдельную RegExp обработку для замены:
$String = "test [or] example ;)"
$String = StringRegExpReplace($String, '([][{}()|.?+*\\^])', '\\\1')
MsgBox(64, "", "Теперь все служебные символы могут обрабатываться как обычные ;) :" & @LF & @LF & $String)
В принципе, можно было бы указать постоянный разделитель, но он должен быть опционально задан в параметре. Т.е вся строка может содержать параметры только одного характера, но нужно сделать так, чтобы функцию можно было применять на разные строки. Вот что у меня (не) получилось:
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param="1" /File=C:\Program Files\Some App\File - Name.txt /URL="http://google.com"'
MsgBox(64, "", _
_GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
_GetCmdLine($CmdLineRaw, "/URL=") & @LF & _
_GetCmdLine($CmdLineRaw, "/File="))
Func _GetCmdLine($sCmdLine, $sArgument, $sCmd_Delim='/.*=')
If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")
Local $sRegExp = '(?i)^.*?\Q' & $sArgument & '\E\s*(?:(?:"([^"]*)")|([^"]+)' & $sCmd_Delim & ').*$'
Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")
Return StringStripWS($sRetCmd, 3)
EndFunc
Стоит только убрать кавычки у одного из значении, и возвращается неверное значение. Нужно чтобы при данном раскладе, возвращались все значения вне зависимости от присутствия кавычек у них.
P.S
$sCmd_Delim это и есть указатель на резделитель, т.е в одной строке могут быть только такие разделители: /Param=, или только такие: -Param=, или такие например: -Param:, но не смешанные (как я задумывал в начале).
Creat0R
Можешь показать на примерной строке? »
$CmdLineRaw = '/Param="/URL http://mail.ru" .File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'
есть проблема с путями без кавычек, они обрубаются на перевом пробеле »
AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом... надо ли городить огород?
оно даже в справке есть
в справке есть, но там туманное описание и не все что в справке работает как написано
Может кто нибудь подсказать как можно взять из файла символы и отправить их в активное окно как нажатие их на клавиатуре
amel27, AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом »
Да, но из за этого юзеры (смышлённые, те которые указывают ком. строку :)) лишний раз спрашивают разные вопросы, мол почему "так" работает, а "так" нет. Хочется перестраховаться, a.k.a “Защита от дурака”.
надо ли городить огород?
Цитата: »
Желательно :)
kronic
как можно взять из файла символы и отправить их в активное окно как нажатие их на клавиатуре »
$sChars = FileReadLine($sFile, 3) ;Считывает символы с третьей строки файла
Send($sChars)
Creat0R
раньше делали отдельную RegExp обработку для замены »
ну как минимум одну замену сделать придется :)$sArgument = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
Хочется перестраховаться »
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно
насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои - символы начала/конца блока параметра ("/-"), внутри которого имя параметра от его значения разделяется другими спецсимволами ("=: "), не будет ли это сменой "шила на мыло" ;) - указанные спецсимволы уже нельзя будет просто так указывать в значении параметров... например, придется брать в кавычки (вместо пробелов) ... заметь, что при этом пробел теряет свой статус и значение может включать несколько строк с экранирующими кавычками, т.е. обработку концевых символов придется проводить отдельно
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'
MsgBox(64, "", _
_GetCmdLine($CmdLineRaw, "Param") & @LF & _
_GetCmdLine($CmdLineRaw, "URL") & @LF & _
_GetCmdLine($CmdLineRaw, "Fil\e"))
Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=: ")
; Экранируем спецсимволы
$sParPrefix = StringRegExpReplace($sParPrefix, "[-^\]", "\\1")
$sValPrefix = StringRegExpReplace($sValPrefix, "[-^\]", "\\1")
$sArgument = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
#Region Построение регулярного выражения
Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)
Local $sParClassIn = '[$sParPrefix$]' ; класс начала имени параметра
Local $sValClassIn = '[$sValPrefix$]' ; класс конца имени/начала значения
Local $sAllClassEx = '[^$sParPrefix$"]' ; класс обычных символов
Local $sRegExp = '(?i)^.*?$sParClassIn$$sArgument$(?:$sValClassIn$+((?:"[^"]*"|$sAllClassEx$+)+))?.*$'
ConsoleWrite($sRegExp &@CRLF)
Opt("ExpandVarStrings", $ExpandVarStrings)
#EndRegion
Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')
If @extended Then Return $sRetCmd
Return SetError(1, 0, "NOT FOUND")
EndFunc
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно »
В том то и дело, что не все придерживаются стандартам. Например, в браузере Opera последних версии, параметры ком. строки (там можно запускать внешние приложения с меню) передаются немного криво. Кавычками обрамляются не только параметры с заглавной буквы (это типа стандарт самого браузера, %U будет в кавычках, а %u уже нет), но и вся ком. строка, т.е на выходе получается что-то типа "/Param="http://..." "some value"". Вобщем не всегда предсказуемый результат имеется, и, кроме того что от версии к версии это по разному, так ещё хотелось иметь универсальный вариант для других случаев, чтобы не нужно было переделывать функцию для каждой задачи отдельно (что я и делал до сих пор).
насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои
Не уверен что понял, но что я хочу сделать я описал в последнем посте (http://forum.oszone.net/post-968906.html#post968906) на эту тему:
В принципе, можно было бы указать постоянный разделитель, но он должен быть опционально задан в параметре. Т.е вся строка может содержать параметры только одного характера »
....
Стоит только убрать кавычки у одного из значении, и возвращается неверное значение. Нужно чтобы при данном раскладе, возвращались все значения вне зависимости от присутствия кавычек у них. »
Осталось только доработать мой код в том посте.
P.S
Спасибо за пример, но там тоже есть проблемы, например если убрать кавычки у /URL, то возвращается только «http:». Также парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом (где «/Param1=Val1/Param2=Val2» уже неверная строка, тут значением считается Val1/Param2=Val2, вот если бы после Val1 был пробел, тогда второй параметр не входил в значение :wacko: ).
Creat0R
так ещё хотелось иметь универсальный вариант для других случаев, чтобы не нужно было переделывать функцию для каждой задачи отдельно »чтобы регулярное выражение работало надежно, оно должно отражать реальный синтаксис строки, у "универсального варианта" с нечеткими правилами формата всегда будут вылазить "дыры" то в одном месте, то в другом...
парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом »хорошо, вот еще вариант реализации, но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра:
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=12 /XXX /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'
MsgBox(64, "", _
"Param: "&@TAB& _GetCmdLine($CmdLineRaw, "Param") & @LF & _
"XXX: " &@TAB& _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
"YYY: " &@TAB& _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
"URL: " &@TAB& _GetCmdLine($CmdLineRaw, "URL") & @LF & _
"Fil\e: "&@TAB& _GetCmdLine($CmdLineRaw, "Fil\e"))
Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=:")
$sPar = StringRegExpReplace ($sParPrefix, "[-^\]", "\\1")
$sVal = StringRegExpReplace ($sValPrefix, "[-^\]", "\\1")
$sArg = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
Local $sRegExp = '(?i)^(?:|.*?\s)['&$sPar&']'&$sArg&'['&$sVal&' ]+(?:$|['&$sPar&']|((?:"[^"]*"|[^"])+?)(?:$|\s['&$sPar&'])).*'
ConsoleWrite($sRegExp &@CRLF)
Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')
If @extended Then Return $sRetCmd
Return SetError(1, 0, "NOT FOUND")
EndFunc
amel27, вот еще вариант реализации »
Почти(!) идеален!
но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра »
Странно, а чем отличается "-" от "/" ? А что если придерживаться условию, что все параметры будут иметь какой-то один разделитель?
Пример:
If $CmdLine[0] = 0 Then $CmdLineRaw = '-Param=1 -XXX=xVal -File=C:\Program Files\Some App\File - Name.txt -URL=http://google.com'
MsgBox(64, "", _
"Param: " & @TAB & _GetCmdLine($CmdLineRaw, "Param") & @LF & _
"XXX: " & @TAB & _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
"YYY: " & @TAB & _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
"URL: " & @TAB & _GetCmdLine($CmdLineRaw, "URL") & @LF & _
"File: " & @TAB & _GetCmdLine($CmdLineRaw, "File"))
$sParPrefix при этом равен "-". Но опять же, имя файл в таком случае обрубается :(
P.S
Теперь что получается, нужно почти при каждом использовании RegExp, применять метод отмены спец. символов (\Q...\E)?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC