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

mikola1983
10-10-2008, 09:47
добрый день..помогите пожалуйста ... есть Label есть Button есть определенная функция ... необходимо значение вводимое в Label после нажатия на батон отправлять в эту функцию (значение есть имя компьютера в сети) тоисть
вот в этой строчке $var = IniReadSection("c:\FILES\PDFTransformer.ini", "USERINFO") вместо c:\FILES должно быть вводимое имя кампа...

и как лучше обрабатывать событие онклик

Maza Faka
10-10-2008, 10:28
mikola1983

значение вводимое в Label

В Label нельзя вводить значения, поскольку это Static control.
Пример:
#include <GuiConstantsEx.au3>

$hGUI = GUICreate("Test GUI", 200, 100)

$Input = GUICtrlCreateInput("", 50, 20, 100, 20)

$Button = GUICtrlCreateButton("Read", 60, 70, 75, 25)

GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $Button
_IniReadSection(GUICtrlRead($Input))
EndSwitch
WEnd

Func _IniReadSection($sCompName)
MsgBox(0, "Path", "\\" & $sCompName & "\C\FILES\PDFTransformer.ini")
EndFunc

amel27
10-10-2008, 12:15
Creat0R
если посмотреть на встроенные функции, такие как GUIRegisterMsg, DllCallbackRegister, то там ведь указывается пользовательская функция, поэтому именно вызывающая функция должна хоть как то отражать её предназначение »дык указанные тобой ф-ции сами-то ничего не делают - только регистрируют UDF в таблице вызовов, настоящие "вызывающие ф-ции" находятся либо в DLL (для DllCallbackRegister), либо это главная оконная процедура (для GUIRegisterMsg) - они и отражают назначение функции. CallBack - это лишь модификатор главной функции, который можно сделать и вовсе необязательным... В API различают шаблон CallBack-функции (типа EnumWindowsProc) из имени которого следует CallBack-назначение функции... и саму функцию, которая может называться как угодно (все равно вызов идет по указателю). У меня дефолтовое имя CallBack-функции аналогично API-шаблону, хотя скриптер по ходу может выбрать любое удобное для себя имя...

Grammaton Cleric
Надо найти иконку в трее, ткнуть по ней правой кнопкой мыши, в контектном меню выбрать пункт, открывается подменю, в нем выбираем значение левой кнопкой мыши »
это сделать и просто, и сложно... задачи на самом деле две:

1. найти на экране положение иконки и вызвать контекстное меню;
2. в контекстном меню активизировать нужный пункт.

по 1-му пункту есть архивный пример (http://forum.oszone.net/post-655084-552.html) Maza Faka, который ссылается на SysTray_UDF (http://www.autoitscript.com/forum/index.php?showtopic=13704), но мне пришлось подправить четыре UDF в пакете прежде чем скрипт заработал... не уверен, что по ходу не всплывут еще ошибки... ИМХО этот пакет давно пора привести в соответствие с версией AutoIT... Хотя я в ГУИ не особо продвинут, может я чего упустил и это можно сделать штатными средствами?... это вопрос к ГУИ-спецам ;)

2-й пункт проще всего реализовать через Send(), перемещая курсор до нужного пункта и запуская по <Enter>... понятно, что при этом меню должно быть статическим (позиция команды не должна меняться). AFAIK можно сделать это и программно - по имени команды, но "готовых к употреблению" UDF не встречал, хотя материал на оффсайте есть, например: How to select an item from a pop-up right click menu? (http://www.autoitscript.com/forum/index.php?showtopic=81266)

mikola1983
10-10-2008, 12:21
Maza Faka, Спасибо да ошибся )) имел ввиду Input

ganselo
10-10-2008, 14:04
Нужно отключать временно клавишу, отсыласть её, и включать обратно: »
Пасиба всё работает.

ещё вопрос. Мне нужно, чтоб скрипт следил за наличием указанного процесса и после того как процесс появился нужно открыть файл test.txt например, после чего в него будут записыватся нажатые клавиши. А после закрытия процесса нужно закрывать файл test.txt(и так бесконечно). Я пробую так:



While 1
Sleep (100)
$PrEx = ProcessExists("notepad.exe")
if $PrEx Then
FileOpen ("test.txt", 1)
Keyboard()
EndIf
if $PrEx=0 Then
FileClose ("test.txt")
EndIf
WEnd



Функция keyboard() записывает нажатые клавиши.
Вобщем после того как процесс появился, то файл открывается и всё записывается в test.txt, а после того как процесс закрывается, то файл test.txt не выгружается (FileClose("test.txt").

Maza Faka
10-10-2008, 14:25
Grammaton Cleric
Рабочий (http://www.autoitscript.com/forum/index.php?showtopic=63397&view=findpost&p=472987) пример по первому пункту.

Мне нужно, чтоб скрипт следил за наличием указанного процесса и после того как процесс появился нужно открыть файл test.txt например, после чего в него будут записыватся нажатые клавиши. »
Никак кейлогер пытаешься написать? Помощи не жди!

ganselo
10-10-2008, 14:40
Никак кейлогер пытаешься написать? Помощи не жди! »

О_о причём тут кейлогер?)

Maza Faka
10-10-2008, 16:25
причём тут кейлогер? »
Да уж очень на то похоже...

ganselo
10-10-2008, 16:28
Да уж очень на то похоже... »

лана спс сам разберусь.

Creat0R
11-10-2008, 15:36
amel27,
Спасибо за разъяснения, полезная инфа по Callback'у :)

У меня тут другая задача появилась, вроде посложнее (и поинтереснее, для меня во всяком случае :) )...
Хочу ещё больше усовершенствовать скрипт раскраски кода, чтобы не использовать SciTE вовсе. Я подумал, а что если написать свой парсер кода на раскраску, т.е как я это понимаю, нужно создать шаблоны стилей (в массиве?), и пройтись по ним регулярными выражениями, обрамляя куски кода нужными тегами. Но хотелось услышать твоё мнение, как наиболее продуктивно можно(?) организовать подобный парсер? И, стоит ли вообще этим заморачиваться.

NikLok
11-10-2008, 17:10
Creat0R, А что ты будешь делать при изменении версии AutoIt - вернее при добавлении в него новых конструкций. Я так думаю что щас этот геморой лежит на SciTE. А ты похоже хочешь его на себя переложить. Что это даст? Извини если я не въехал?

Creat0R
11-10-2008, 18:11
NikLok, что ты будешь делать при изменении версии AutoIt - вернее при добавлении в него новых конструкций »
Какие конструкции ещё могут придумать? :) Просто нужно предусмотреть шаблоны замены, чтобы каждый желающий позже смог менять цвета по необходимости (без лишних телодвижении)...

morgan1991
12-10-2008, 13:06
Люди помогите. Как зделать так чтобы после нажатия левой клавиши мыши скрипт запускал определённую функцию?
что бы было чтото типо "HotKeySet()"

Creat0R
12-10-2008, 13:41
Как зделать так чтобы после нажатия левой клавиши мыши скрипт запускал определённую функцию? »
Простой способ:

#include <Misc.au3>

While 1
If _IsPressed("01") Then MyFunc()
Sleep(10)
WEnd

Func MyFunc()

EndFunc

Но есть способ с использованием _MouseSetOnEvent() UDF (http://www.autoitscript.com/forum/index.php?showtopic=64738)...

#include <MouseSetOnEvent_UDF.au3>

;Disable Primary mouse button *down*, and call our function when mouse button *down* event is recieved
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "MousePrimaryDown_Event")
Sleep(5000)
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT) ;Enable mouse button back.

MsgBox(64, "Attention!", "Now we disable Secondary mouse button up, and call our function when mouse button up event is recieved.", 5)

;Disable Secondary mouse button *up*, and call our function when mouse button *up* event is recieved
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, "MouseSecondaryUp_Event")
Sleep(5000)
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT) ;Enable mouse button back.

Func MousePrimaryDown_Event()
ConsoleWrite("Primary Mouse Down" & @LF)
EndFunc

Func MouseSecondaryUp_Event()
ConsoleWrite("Secondar Mouse Up" & @LF)
EndFunc

morgan1991
12-10-2008, 13:43
Creat0R, спс!

amel27
13-10-2008, 05:35
Creat0R
чтобы не использовать SciTE вовсе. »
Из спортивного интереса?.. AutoIT без SciTE не распространяется. Или все-таки есть другие причины? NikLok прав - часть поддержки придется взять на себя, тот же список штатных UDF постоянно меняется.
стоит ли вообще этим заморачиваться »
зависит от ответа на предыдущий вопрос ;) ...в общем случае задача разборки текста кода не из легких, но AutoIT имеет достаточно простой синтаксис, поэтому, думаю можно обойтись одним лексическим анализом (без синтаксического). Тем более, что SciTE для раскраски тоже не особо заморачивается синтаксисом, пример тому - строку "{1}" SciTE всегда раскрасит как операторы Send(), что совсем не к месту в регулярных выражениях.
нужно создать шаблоны стилей (в массиве?), и пройтись по ним регулярными выражениями, обрамляя куски кода нужными тегами »В первом приближении да, но уже обработанные куски кода нужно будет исключать из дальнейшей обработки... Соответственно, порядок применения "фильтров" нужно тоже продумать - это может значительно упростить составление регулярных выражений.

Creat0R
13-10-2008, 10:27
amel27, Из спортивного интереса? »
От части да :)

AutoIT без SciTE не распространяется. Или все-таки есть другие причины? »
Причины есть, такие как:


Ускорение обработки.
Предотвращение лишней записи файлов на диск.
Независимая схема раскраски.
И вообще независимость в целом, мне кажется что любая программа по возможности должна уметь работать самостоятельно, и как можно меньше использовать внешние модули.


часть поддержки придется взять на себя, тот же список штатных UDF постоянно меняется. »
Я если честно не вижу как список UDF может повлиять на процесс раскраски? :) Пока синтаксис не меняется, или не добавляются новые операторы и т.п., менять и поддерживать ничего вроде не нужно будет.

mikola1983
15-10-2008, 10:31
Почему это неработает?
$var = IniReadSection("\\"&$sCompName&"\C\FILES\PDFTransformer.ini", "USERINFO")
получается вполне нормальный путь если отправлять ето в месадж. но инирид невидит файл

Maza Faka
15-10-2008, 12:10
Почему это неработает? »
У меня работает, проверь правильность пути и файла.

#include <Array.au3> ;Только для ArrayDisplay()

$sCompName = "WS1"
$var = IniReadSection("\\" & $sCompName & "\C\config.ini", "Section")

_ArrayDisplay($var)

amel27
16-10-2008, 08:38
Creat0R
Причины есть, такие как »
существенных вижу только две - "независимая схема раскраски" и "интерес" :)
про скорость еще рано говорить, про файлы тоже... "независимость" и вовсе штука относительная, особенно в мире программ ;)
не вижу как список UDF может повлиять на процесс раскраски? Пока синтаксис не меняется, или не добавляются новые операторы
Синтаксис на раскраску как раз не влияет - и это гут... иначе проблем не оберешься... к примеру, в CMD раскрасить код на порядок сложнее (нормально, а не как в SciTE). В лексическом анализе без сверки со словарем обойтись проблематично - иначе не отделить функции от операторов, операторы от UDF и т.д. Тот же SciTE поддерживает полный список всех служебных слов - в том числе системных UDF, а эти списки сильно меняются от версии к версии.

Как вариант - восстановить список используемых UDF из самого скрипта. Это позволит строить схемы раскраски, используя:
- имя UDF (это просто);
- имя загружаемого файла, в котором определен UDF (обычно синхронен с именем UDF, хотя и не всегда);
- тип загружаемого файла (системный, пользовательский, другой)... имхо самая полезная фича.

Примеры UDF, с помощью которых можно это реализовать:#include <array.au3>

Global $v[1]
_AU3_GetAllLibUDF (FileRead(@ScriptFullPath), $v)

For $i=1 To $v[0][0]
ConsoleWrite($v[$i][0] &":"& $v[$i][1] &@CRLF)
$a = $v[$i][2]
If IsArray($a) Then
For $j=0 To UBound($a)-1
ConsoleWrite(@TAB& $a[$j] &@CRLF)
Next
EndIf
Next

; ===============================================================
; _AU3_GetAllLibUDF($text, $var)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $text : текст AutoIT-скрипта
; $var : ссылка на переменную для выходного массива,
; по выходу содержит двумерный массив:
; $var[0][0] - количество элементов в массиве
; $var[$i][0] - тип библиотечного файла
; $var[$i][1] - имя библиотечного файла (без пути)
; $var[$i][2] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
; ===============================================================
Func _AU3_GetAllLibUDF($text, ByRef $var)
Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'
; Инициализация массива при первом входе / сохранение списка UDF
If UBound($var,2)<>3 Then Dim $var[2][3] = [[1,0,0],[0,"",0]]
$var[$var[0][0]][2] = StringRegExp($text, $rUDFs, 3)
; Инициализация переменных / Получение списка библиотечных файлов
Local $sPath, $iType, $sName, $sText
Local $aFile=StringRegExp($text, $rFile, 3)
; Пофайловая обработка списка библиотек
If IsArray($aFile) Then
For $i=0 To UBound($aFile)-1
$sPath = _AU3_LibIncToPath($aFile[$i]) ; полное имя файла
If @error Then ContinueLoop ; файл не найден
$iType = @extended ; тип библиотеки
$sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "") ; краткое имя файла
; Исключение повторной обработки / Чтение файла
For $j=1 To $var[0][0]
If $var[$j][0]==$iType And $var[$j][1]==$sName Then ContinueLoop 2
Next
$sText = FileRead($sPath)
If @error Then ContinueLoop
; При успешном чтении добавляем файл в выходной массив
$var[0][0] +=1
ReDim $var[$var[0][0]+1][3]
$var[$var[0][0]][0] = $iType
$var[$var[0][0]][1] = $sName
; Рекурсивный вызов на обработку текста библиотеки
_AU3_GetAllLibUDF($sText, $var)
Next
EndIf
EndFunc ; ==> _AU3_GetAllLibUDF

; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке агрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude : строка загрузки в формате #include, примеры:
; '<array.au3>'
; '"array.au3"'
; '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе : возвращает полное имя файла, содержащее путь,
; макрос @extended указывает на тип библиотеки:
; 1 - системная библиотека (каталог установки)
; 2 - текущая библиотека (каталог скрипта)
; 3 - пользовательская библиотека (путь из реестра)
; 4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
; 1 - ошибка формата строки
; 2 - файл не найден
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)
; Проверка на корректность формата строки
If Not(IsArray($aRegExp)) Then Return SetError(1, 0, "")
$sInclude = $aRegExp[1]

If StringInStr($sInclude, "\") =0 Then
Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir &"\"& $sInclude
; Определение каталога системных библиотек
$sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
$sSYS &= "\Include\"& $sInclude
; Чтение списка каталогов пользовательских библиотек
$sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
$aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
; Проверка типов 1 и 2 (до пользовательских библиотек)
If $aRegExp[0]=='<' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
ElseIf $aRegExp[0]=='"' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
EndIf
; Проверка типа 3 (поиск среди пользовательских библиотек)
If IsArray($aUDL) Then
For $i=0 To UBound($aUDL)-1
$aUDL[$i] &= "\"& $sInclude
If FileExists($aUDL[$i]) Then Return SetError(0,3,$aUDL[$i])
Next
EndIf
; Проверка типов 1 и 2 (после пользовательских библиотек)
If $aRegExp[0]=='<' Then
If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
ElseIf $aRegExp[0]=='"' Then
If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
EndIf
Else
; Проверка типа 4 (файл с указанием полного пути)
If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
EndIf
; ОШИБКА: файл не найден
Return SetError(2, 0, "")
EndFunc ; ==> _AU3_LibIncToPath




© OSzone.net 2001-2012