PDA

Показать полную графическую версию : [Архив - Часть 3] 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

EvgeniuXP
05-10-2008, 23:23
Как с помощью скрипта AutoIt заблокировать клавиатуру и мышку, чтоб пользователь во время выполнения скрипта не мог случайно нажать клавишу, переместить мышку, активировать другое окно.

Вопрос отпал, нашел: BlockInput(1) или (0) - включить/выключить.

Creat0R
06-10-2008, 04:38
Что мне делать и как быть? »
А почему именно в Mozilla это нужно делать? почему не в IE? для него есть библиотека IE.au3 (поставляется в комплекте с AutoIt).. впрочем и для Mozilla есть нечто подобное: FF.au3 (http://thorsten-willert.de/Themen/AutoIt-FF.au3/FF.au3/FF.au3) (источник (http://translate.google.com/translate?u=http://www.autoit.de/index.php?page=Thread&threadID=3629&langpair=de|en&hl=en&ie=UTF-8)), но не уверен что там можно также просто вставлять/получать текст в/с форм(у)...

amel27
06-10-2008, 13:20
Creat0R, Не знаю на сколько будет полезно »
в таком виде действительно пользы мало - по сути RegExpReplace() заменяется реализацией через RegExp(), и неясно причем тут технология CallBack :dont-know ...но твой пост сподвиг меня на реализацию давней "хотелки" с использованием групповых подстановок:$sString = "c:\DIR1\file1.txt" &@CRLF
$sString &= "c:\DIR1\file2.doc" &@CRLF

$sRetVar = _StringRegExpReplaceEx($sString, "((?:[^\r\n\\]+\\)+)([^\r\n\\]+?)(\.[^.\r\n]+)", "_ChPathExt")

MsgBox(64, "Results", StringFormat("Было:\n%s\n\nСтало:\n%s\n\n\n" & _
"Для всех файлов исходный путь заменяется на резервный, а к расширению добавляется 'BAK'", $sString, $sRetVar))

Func _StringRegExpReplaceEx($sString, $sPattern, $sFunction)
Local $sReplace
Local $aM1 = StringRegExp($sString, $sPattern, 4), $aM2
If IsArray($aM1) Then
For $i=0 To UBound($aM1)-1
Local $as[10]=['','','','','','','','','','']
$aM2=$aM1[$i]
For $j=0 To UBound($aM2)-1
$as[$j]=$aM2[$j]
Next
$sReplace = Call($sFunction, $as)
$sString = StringReplace($sString, $aM2[0], $sReplace, 1, 1)
Next
EndIf
Return $sString
EndFunc

Func _ChPathExt($aGroups)
Local Const $sNewPath = "d:\DIR2\"
Local Const $sNewExtn = $aGroups[3] &".Bak"

Return $sNewPath & $aGroups[2] & $sNewExtn
EndFunc

P.S. Между прочим, такой код далеко небезукоризнен, так как каждый StringReplace() ищет вхождения с начала строки, поэтому в некоторых случаях замена может произойти раньше чем задумано.

Creat0R
06-10-2008, 21:45
amel27,
в таком виде действительно пользы мало »
Ну да, я ж написал что это прототип :tongue:

неясно причем тут технология CallBack »
Ну я так себе это представлял.. если вызывается подфункция которая возвращает значения в исходную функцию, то это как бы своего рода Callback :)

твой пост сподвиг меня на реализацию давней "хотелки" с использованием групповых подстановок »
Интересно... кстати, Valik мне там ответил в тикете (http://svn.autoitscript.com/trac/ticket/588), он утверждает что эта затея средствами UDF не реализуема, он привёл пример где моя функция провалилась, однако я натравил на его пример твою функцию, и она работает как обычный RegExpReplace... т.е значит это всё же возможно?
Если не трудно, почитай тот запрос, может действительно у тебя получилось сделать то что там предлагается...

FaustPatron
07-10-2008, 01:03
Creat0R, Подскажи где взять описание на русском для библиотеки IE.au3
Если перевод существует конечно.

amel27
07-10-2008, 05:43
Creat0R
если вызывается подфункция которая возвращает значения в исходную функцию, то это как бы своего рода Callback »"своего рода" может быть, AFAIK изначально CallBack был задуман для управления поведением бинарного кода, который неизменяем (так как уже скомпилирован) через использование указателей. Чем-то похоже на клиент-серверную технологию, только "серверу" передаются на обработку не данные, а код. Фишка еще в том, что «сервер» может выполняться с другими правами в системе. Но даже если понимать CallBack как вызов пользовательской UDF из сервисной, то в твоем случае CallBack-функцией будет как раз _UpperMatches(), а не *RegExpReplace* ;)

Valik мне там ответил в тикете, он утверждает что эта затея средствами UDF не реализуема »гм… интересно, про PHP не знал… по сути, я уже озвучил точку зрения Valik'а в своем постскриптуме про StringReplace, хотя его пример уже совсем про другое – про особенность работы StringRegExp… что касаемо принципиальной невозможности реализации… имхо можно поизголяться :) ...вот пример с двумя реализациями UDF: первый показывает ошибку при использовании StringReplace, во втором я попытался ее обойти.
$sString = "c:\DIR1\DIR1\file1.txt" &@CRLF
$sString &= "c:\DIR1\DIRA\file2.doc" &@CRLF
$sString &= "c:\DIR1\file1.txt" &@CRLF

$sRetVar1 = _StringRegExpReplaceEx1($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")
$sRetVar2 = _StringRegExpReplaceEx2($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")

MsgBox(64, "Results", StringFormat("Было:\n%s\nСтало_1:\n%s\n\nСтало_2:\n%s\n\n" & _
"Для всех файлов в исходном пути убирается корневая папка.", $sString, $sRetVar1, $sRetVar2))

Func _StringRegExpReplaceEx1($sString, $sPattern, $sFunction)
Local $aM1 = StringRegExp($sString, $sPattern, 4)
Local $sReplace, $aM2

If IsArray($aM1) Then
For $i=0 To UBound($aM1)-1
Local $as[10]=['','','','','','','','','','']
$aM2=$aM1[$i]
For $j=0 To UBound($aM2)-1
$as[$j]=$aM2[$j]
Next
$sReplace = Call($sFunction, $as)
$sString = StringReplace($sString, $aM2[0], $sReplace, 1, 1)
Next
EndIf
Return $sString
EndFunc

Func _StringRegExpReplaceEx2($sString, $sPattern, $sFunction)
Local $sSqueeze = StringRegExpReplace($sString, $sPattern, Chr(0))
Local $aSqueeze = StringSplit($sSqueeze, Chr(0))
Local $sResult = ""

Local $aM1 = StringRegExp($sString, $sPattern, 4), $aM2
If IsArray($aM1) Then
For $i=0 To UBound($aM1)-1
Local $as[10]=['','','','','','','','','','']
$aM2=$aM1[$i]
For $j=0 To UBound($aM2)-1
$as[$j]=$aM2[$j]
Next
$sResult &= $aSqueeze[$i+1] & Call($sFunction, $as)
Next
EndIf
Return $sResult & $aSqueeze[$aSqueeze[0]]
EndFunc

Func _ChPathExt($aGroups)
Local Const $sNewRoot = "c:"

Return $sNewRoot & $aGroups[2]
EndFunc

6757439
07-10-2008, 15:49
Всем привет! Я недавно начал пользоваться этой программой и уже столкнулся с проблемой. У меня никак не получается перезаписать ini файл. Задача состоит в том, что нужно скопировать ячейку в .xls файле и записать эту информацию в определенный ключ в ini файле. И сделать это еще раз.
Проблему в этой строчке "IniWrite("C:\Work\Test.ini", "DB", "sn", Send ('+{INS}'))", а именно в комманде записи ключа из буфера обмена, я не могу решить сам.
Была идея заносить что скопировано в переменную, а потом её выводить в файл, но и это у меня не получилось.
Прошу вашего совета.


WinActivate ("Microsoft Excel - филиалы.xls")
$1 = WinWaitActive ("Microsoft Excel - филиалы.xls", "", "2")
If $1 = True Then
SEND("{RIGHT}")
Sleep (100)
Send ('^{INS}')
Sleep (100)
IniWrite("C:\Work\Test.ini", "DB", "sn", Send ('+{INS}'))
WinActivate ("Microsoft Excel - филиалы.xls")
SEND("{RIGHT}")
Sleep (100)
Send ('^{INS}')
Sleep (100)
SEND("{LEFT}")
SEND("{LEFT}")
IniWrite("C:\Work\Test.ini", "DB", "dn", Send ('+{INS}'))
Else
MsgBox (0, "Ошибка", "")
EndIf

Рысь
07-10-2008, 16:31
6757439, потому что Вы не совсем корректно используете функцию IniWrite, в месте, где у Вас "Send ('+{INS}')" нужно постить текст..

чтобы вставить содержимое буфера обмена, нужно использовать такую связку:

$a = ClipGet() ; Содержимое буфера обмена присваивается переменной $a
IniWrite("C:\Work\Test.ini", "DB", "sn", $a) ; Здесь при записи вместо какого-либо текста используется содержимое буфера обмена

6757439
07-10-2008, 17:30
Все получилось благодаря подсказке Рысь. Появилась еще одна проблема:
При запуске программы (через AutoIt3), которая использует вышеописанный ini файл, выводится сообщение об ошибке "не удалось прочитать данные из .ini файла". Хотя если запускаю через эксплорер - все отлично открывается.
В чем может быть загвоздка?
Для запуска использую следующую строку:

Run("C:\Work\assistant.exe")

Maza Faka
07-10-2008, 18:27
6757439
Появилась еще одна проблема
Попробуй задать путь к папке с программой в качестве рабочего каталога:

Run("C:\Work\assistant.exe", "C:\Work")

6757439
08-10-2008, 11:52
Попробуй задать путь к папке с программой в качестве рабочего каталога:
Код:
Run("C:\Work\assistant.exe", "C:\Work")
Заработало! Спасибо за подсказку!

Frost_Imp
08-10-2008, 14:10
Всем доброго времени суток!
Прошу помочь мне написать следующий простенький код...
В общем есть у меня некое изображение на экране. Мне необходимо отследить, меняется ли цвет определенного пиксела... В общем смотрите:
Func GetBuf()
$time = 0
$err = 0
While $time <= 5000
$p = PixelGetColor (1162,434)
If $p = 0xEBEC76
$time= $time+500
Sleep (500)
Else
$err = $err + 1
$time= $time+300
Sleep (300)
EndIf
WEnd
EndFunc
Суть следующая: сначала задаю значение переменных $time и $err равными нулю. Затем вхожу в цикл, в начале которого проверяю значение $time, чтобы цикл не уходил в бесконечность. Затем определяю цвет пикселя в определенном месте окна (PixelGetColor). Если цвет меня устраивает (If $p = 0xEBEC76) - увеличиваю значение переменной $time, делаю паузу на полсекунды (Sleep (500)) и опять вхожу в цикл. Если цвет меня НЕ устраивает - увеличиваю значение переменной $err, делаю паузу (Sleep (300)) и снова вхожу в цикл, пока буду удовлетворять условиям $time <= 5000.
После выполнения функции меня интересует значение параметра $err. В случае, если оно >0, то все в порядке, и процедуру нужно повторить, скажем, через 5 минут. Но если это значение равно 0, то необходимо вывести какое-нибудь диалоговое окно, пикнуть встроенным динамиком компа и завершить процедуру.
Помогите, плиз, написать единый код, так как у меня проблемы с передачей параметров(

Maza Faka
08-10-2008, 15:07
Frost_Imp
Возвращай из функции значение и на основе этого значения переходи к тому или иному действию, что-то вроде этого:
;Здесь у нас GUI
;;;;;;;;;;;;;;;;

;Главный цикл
While 1
Sleep(100)
WEnd

Func GetBuf()
Local $time = 0, $err = 0, $p

While $time <= 5000
$p = PixelGetColor(1162,434)
If $p = 0xEBEC76
$time= $time + 500
Sleep(500)
Else
$err = $err + 1
$time = $time + 300
Sleep(300)
EndIf
WEnd

If $err > 0 Then
Return True
Else
Beep(500, 1000)
Return False
EndIf
EndFunc


процедуру нужно повторить, скажем, через 5 минут

Используй функции TimerInit(); TimerDiff()

Frost_Imp
Вариант без GUI:
While 1
Local $time = 0, $err = 0, $p

While $time <= 5000
$p = PixelGetColor(1162,434)
If $p = 0xEBEC76 Then
$time= $time + 500
Sleep(500)
Else
$err = $err + 1
$time = $time + 300
Sleep(300)
EndIf
WEnd

If $err = 0 Then
Beep(500, 1000)
Exit
EndIf

Sleep(1000 * 300) ;Пауза 5 мин.
WEnd

Frost_Imp
08-10-2008, 18:26
Maza Faka, спасибо! Подошел "Вариант без GUI". Я, правда, не понял, причем тут GUI...
Еще просьба: можно ли усовершенствовать эту процедуру таким образом, чтобы при ее запуске юзеру показывалось бы диалоговое окно, в которое он сам смог бы вносить различные парамеры? Ткните носом плиз, где это можно почитать либо опишите простой пример.
Буду очень благодарен!

Maza Faka
09-10-2008, 09:39
Ткните носом плиз »
Читай справку, там всё очень подробно описано и показано. :)

Grammaton Cleric
09-10-2008, 10:38
Народ помогите пожалуйста горю начинающего "автоитера".
Часто приходится переставлять приложение, которое настраивается несколько неудобным способом... Еще и само приложение сырое, но заставляют его использовать, так как других нету для этих целей.
В общем передо мной такая дилемма:
Надо найти иконку в трее, ткнуть по ней правой кнопкой мыши, в контектном меню выбрать пункт, открывается подменю, в нем выбираем значение левой кнопкой мыши... Затем еще раз по иконке в трее, и в основном контекстном меню выбрать другой пункт и нажать левой кнопкой... (Названия пунктов меню известно... :) )
Естественно точное расположение этой самой иконки в трее не известно... Само приложение нормально запускается и работает, но работает в фоне (GUI у него только для настройки и вызывается этой самой правой кнопкой по иконке). Все его настройки происходят через трей.

amel27
09-10-2008, 12:30
Creat0R

Valik'а вроде устроил последний вариант, дописал UDF и создал тему (http://www.autoitscript.com/forum/index.php?showtopic=82292) на оффсайте
ты бы прав насчет разработчиков - теперь они точно не реализуют эту фичу в AutoIT :unsure:

Creat0R
09-10-2008, 19:17
amel27,
Valik'а вроде устроил последний вариант »
Ага, это он видимо полинился сам сделать подобное в качестве встроенной функции :biggrin:

дописал UDF и создал тему (http://www.autoitscript.com/forum/index.php?showtopic=82292) на оффсайте
Супер!

По поводу имени функции. Имхо, она будет лучше отражать смысл если её назвать хотя бы так: _StringRegExpCallBackReplace()
То что вызываема функция это и есть callback-функция это не спорю, но если посмотреть на встроенные функции, такие как GUIRegisterMsg, DllCallbackRegister, то там ведь указывается пользовательская функция, поэтому именно вызывающая функция должна хоть как то отражать её предназначение :)

теперь они точно не реализуют эту фичу в AutoIT
Если Valik найдёт проблему в UDF (и если его не побидит лень) то он скорее всего это сделает, насколько я помню, если он “загорается” что-то сделать (а в этом случае оно вроде так и есть), то рано или поздно оно реализуется.

ganselo
09-10-2008, 21:10
Пред всем. У меня возникла проблемка, прошу помочь


FileOpen (@ScriptDir & "\1.txt", 1)
HotKeySet ("{a}", "a")
HotKeySet ("{b}", "b")
HotKeySet ("{c}", "c")

While 1
Sleep (100)
WEnd

Func a()
FileWrite ("1.txt", "a")
EndFunc
Func b()
FileWrite ("1.txt", "b")
EndFunc
Func c()
FileWrite ("1.txt", "c")
EndFunc


Вобщем всё работает, скрипт запускается и записывает в файл 1.txt буквы а, b, c при нажатии соответствующих клавишь. Но после загрузки скрипта другие приложение не могут получять поток ввода от нажатий клавишь a,b,c (т.е если запущен скрипт и зайти в notepad например, то при нажатии a,b,c в notepade ни чего не происходит, но в файл 1.txt эти нажатия записываются). Собственно, как можно перенаправлять поток ввода и в приложение и в скрипт? help)

Creat0R
10-10-2008, 00:59
как можно перенаправлять поток ввода и в приложение и в скрипт? »
Нужно отключать временно клавишу, отсыласть её, и включать обратно:

$hFileOpen = FileOpen(@ScriptDir & "\1.txt", 1)

HotKeySet("^q", "_Quit")

HotKeySet("{a}", "_ABC")
HotKeySet("{b}", "_ABC")
HotKeySet("{c}", "_ABC")

While 1
Sleep (100)
WEnd

Func _ABC()
Local $sHotKey = @HotKeyPressed
FileWrite($hFileOpen, StringRegExpReplace($sHotKey, "[\}\{]", ""))

HotKeySet($sHotKey)
Send($sHotKey)
HotKeySet($sHotKey, "_ABC")
EndFunc

Func _Quit()
FileClose($hFileOpen)

Exit
EndFunc

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




© OSzone.net 2001-2012