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

amel27
05-07-2008, 09:42
Creat0R
Как видно, добавляется в начало span id="BeginvidDesc....">, а иногда и в конце тоже добавляются теги. Реально ли одно-разовым вызовом StringRegExp (и без дополнительных циклов) получить то что нужно? »опять не понял смысл квадратных скобок в твоем выражении, попробуй так:$sSource = FileRead("test.txt")
$avArray = StringRegExp($sSource, '(?i)(?s)<div class="vldesc">\s*(?:<span id="BeginvidDesc[^">]*">)?\s*(.*?)\s*(?:</span>|</div>)', 3)

For $i=0 To UBound($avArray)-1
ConsoleWrite($avArray[$i]&@CRLF)
Next

Maza FakaА поиск во вложенных контейнерах сложная задача? »думаю нужно что-то типа рекурсии, на MSDN есть подробная инструкция с примером: Determining Available Network Resources (http://msdn.microsoft.com/en-us/library/aa922358(printer).aspx). Статья для Windows Mobile, но общий алгоритм одинаков.

Creat0R
05-07-2008, 15:40
amel27, опять не понял смысл квадратных скобок в твоем выражении
:) - Я не знал как указать движку RegExp что я хочу искать в начале либо одно, либо другое, но при этом чтобы то что я ищу не попало в результат.

попробуй так:
Спасибо огромное! Вроде всё отлично отрабатывает, но хотелось бы понять как?! :unsure: Почему то, что в первых круглых скобках не попадает в результат (в строки массива)? И что означает «:?» ?

Ответ на последеий мой вопрос предоставляет объяснение и на первый вопрос :)

(?: ... ) - Non-capturing group. Behaves just like a normal group, but does not record the matching characters in the array nor can the matched text be used for back-referencing.

И как я это мог упустить в справке...

266903582
06-07-2008, 16:19
В windowinfo есть инструмент finder tool: наводим его на объект и получаем информацию о нем. Хочу написать что-то подобное для получения только некоторой необходимой информации и сбрасывать ее в файл, осталось только разобраться как получать инфо об объекте под курсором...

beve
06-07-2008, 19:31
Привет всем. У меня вопрос по autoit. Вопрос вроде легкий, а решить уже 2 дня не могу. И в связи что легкий нигде нет ответа, а по совету из справки у меня получается каламбур. Подскажите знающие. Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. Спасибо. :help

Creat0R
06-07-2008, 19:37
266903582, как получать инфо об объекте под курсором... »

Продвинуты пример (сам делал (http://www.autoitscript.com/forum/index.php?s=&showtopic=60155&view=findpost&p=453580) :) ):

#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
;

Opt("GuiOnEventMode", 1)

HotKeySet("{ESC}", "QuitApp")

Global $hSquare_GUI = -1
Global $hCtrl = -1
Global $Last_hControl = -1

Global $Frame_Color = 0xFF0000
Global $Frame_Width = 3

$Main_GUI = GUICreate("Highlight Controls Demo")
WinSetOnTop($Main_GUI, "", 1)

GUISetOnEvent($GUI_EVENT_CLOSE, "QuitApp")
GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

GUICtrlCreateButton("Button", 20, 20)
GUICtrlCreateCheckbox("CheckBox", 20, 60)

GUICtrlCreateLabel("Info: ", 20, 150)
GUICtrlSetFont(-1, 9, 800)

$Info_Edit = GUICtrlCreateEdit("", 80, 150, 300, 220, $GUI_SS_DEFAULT_EDIT + $ES_READONLY)

GUISetState()

While 1
Sleep(10) ;So the CPU will not increes "badly" while we play with the mouse cursor :)
_IdleWait()

If _IsPressed(1) Then
GUIDeleteSquare($hSquare_GUI)

While _IsPressed(1)
Sleep(10)
Check_Highlight_Controls_Proc()
WEnd

$Last_hControl = -1
EndIf

Check_Highlight_Controls_Proc()
WEnd

Func Check_Highlight_Controls_Proc()
Local $hCtrl = _ControlGetHovered()

If $hCtrl <> 0 And $Last_hControl <> $hCtrl And $hSquare_GUI <> $hCtrl Then
$Last_hControl = $hCtrl
Local $aCtrlPos = WinGetPos($hCtrl)

GUICtrlSetData($Info_Edit, _
"X = " & $aCtrlPos[0] & @CRLF & _
"Y = " & $aCtrlPos[1] & @CRLF & _
"W = " & $aCtrlPos[2] & @CRLF & _
"H = " & $aCtrlPos[3] & @CRLF & @CRLF & _
"Control/Win Class Name: " & _WinGetClassNameNN($hCtrl) & @CRLF & _
"Control/Win Handle: " & $hCtrl & @CRLF & _
"Control ID: " & _HwndToID($hCtrl) & @CRLF & @CRLF & _
"Control Data:" & @CRLF & ControlGetText($hCtrl, "", ""))

GUIDeleteSquare($hSquare_GUI)
$hSquare_GUI = GUICreateSquare($aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3])
EndIf
EndFunc

Func GUICreateSquare($i_X = -1, $i_Y = -1, $i_W = -1, $i_H = -1)
Local $hSquare_GUI = GUICreate("", $i_W, $i_H, $i_X, $i_Y, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
GUISetBkColor($Frame_Color)

_GUISetHole($hSquare_GUI, $Frame_Width, $Frame_Width, $i_W - ($Frame_Width * 2), $i_H - ($Frame_Width * 2))

GUISetState(@SW_SHOWNOACTIVATE, $hSquare_GUI)

Return $hSquare_GUI
EndFunc

Func GUIDeleteSquare($hSquare_GUI)
If IsHWnd($hSquare_GUI) And $hSquare_GUI <> $Main_GUI Then GUIDelete($hSquare_GUI)
EndFunc

Func _ControlGetHovered()
Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))

If @error Or Not IsArray($aRet) Then Return SetError(1, 0, 0)
Return HWnd($aRet[0])
EndFunc

Func _HwndToID($hWnd)
If Not IsHWnd($hWnd) Then Return SetError(1, 0, "")

Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
If Not IsArray($aRet) Then Return SetError(2, 0, "")

Return $aRet[0]
EndFunc

Func _WinGetClassName($hWnd)
$aClassName = DllCall("user32.dll", "int", "GetClassName", "hWnd", $hWnd, "str", "", "int", 64)
If Not @error And $aClassName[0] <> 0 Then Return $aClassName[2]
Return ""
EndFunc

Func _WinGetClassNameNN($hCtrlWnd)
$hParent = _WinAPI_GetAncestor($hCtrlWnd, $GA_ROOTOWNER)
$hCtrlWnd = ControlGetHandle($hParent, "", $hCtrlWnd)
$sClassList = StringSplit(StringStripCR(_WinGetNumeratedClassList($hParent)), @LF)

For $i = $sClassList[0] To 1 Step -1
If $sClassList[$i] = "" Then ContinueLoop

If ControlGetHandle($hParent, "", $sClassList[$i]) = $hCtrlWnd Then Return $sClassList[$i]
Next

Return _WinGetClassName($hCtrlWnd)
EndFunc

Func _WinGetNumeratedClassList($sTitle, $sText = "")
Local $sClassList = WinGetClassList($sTitle, $sText)
Local $aClassList = StringSplit($sClassList, @CRLF)
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] & @CRLF
Else
$aClassList[$i] &= "~1"
$sHold_List &= $aClassList[$i] & "|"
$sRetClassList &= $aClassList[$i] & @CRLF
EndIf
Next

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

Func _GUISetHole($hWin, $i_X, $i_Y, $i_SizeW, $i_SizeH)
Local $aWinPos, $Outer_Rgn, $Inner_Rgn, $Wh, $Combined_Rgn
Local Const $RGN_DIFF = 4
$aWinPos = WinGetPos($hWin)

$Outer_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", $aWinPos[2], "long", $aWinPos[3])
$Inner_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", $i_Y, "long", $i_Y, "long", $i_Y + $i_SizeW, _
"long", $i_Y + $i_SizeH)
$Combined_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
DllCall("gdi32.dll", "long", "CombineRgn", "long", $Combined_Rgn[0], "long", $Outer_Rgn[0], "long", $Inner_Rgn[0], _
"int", $RGN_DIFF)
DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWin, "long", $Combined_Rgn[0], "int", 1)
EndFunc

Func _IdleWait($IdleSec = 0)
Local $iSave, $stLastInput = DllStructCreate("uint;dword")
DllStructSetData($stLastInput, 1, DllStructGetSize($stLastInput))
DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))

Do
$iSave = DllStructGetData($stLastInput, 2)
Sleep(20)
DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))
Until (DllStructGetData($stLastInput, 2) - $iSave) > $IdleSec

Return DllStructGetData($stLastInput, 2) - $iSave
EndFunc

Func WM_WINDOWPOSCHANGED($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI <> $Main_GUI Then Return $GUI_RUNDEFMSG
GUIDeleteSquare($hSquare_GUI)
Check_Highlight_Controls_Proc()
$Last_hControl = -1
EndFunc

Func QuitApp()
Exit
EndFunc

beve, Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. »

Примерно так:

$sSystemDate = @MDAY & "/" & @MON & "/" & @YEAR

If $sSystemDate = "08/08/2008" Then
Run("Моя программа.exe")
Else
Exit
EndIf

:)

beve
06-07-2008, 20:00
Спасибо, Creat0R за ответ. Мой вопрос решен.

266903582
06-07-2008, 23:28
Creat0R, спасибо.
Я тоже без дела не сидел :) небольшой концептик получился, по свободняку расширю его твоим примером:

#include <Misc.au3>
FileDelete("file.txt")
$dll = DllOpen("user32.dll")
$file = FileOpen("file.txt", 1)
$ffi=""
While 1
if _IsPressed("11", $dll) Then ;ctrl ctrltext & classn
wr(ControlGetText("","",ControlGetFocus(""))&@lf&ControlGetFocus(""))
EndIf
if _IsPressed("12", $dll) Then ;alt title & alltext
wr(WinGetTitle("")&@lf&"-------"&@lf&WinGetText(""))
EndIf
if _IsPressed("1b", $dll) Then Exit ;esc
sleep(50)
WEnd
DllClose($dll)
FileClose($file)

Func wr($ff)
if $ffi<>$ff then ;исключаем попадание многократных копий захваченного текста в файл
FileWrite($file,$ff&@LF&"-------"&@lf) ;пишем форматированный текст
$ffi=$ff
ToolTip($ffi)
EndIf
EndFunc

amel27
08-07-2008, 15:01
Maza Faka
поиск во вложенных контейнерах сложная задача?
как оказалось можно без рекурсии - нужно только правильно заполнить структуру стартового контейнера
Спасибо за пример »
будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы: :biggrin:

_WinNet_OpenEnum()
_WinNet_CloseEnum()
_WinNet_EnumResource()

но мне они показались неудобными в применении, посуди сам:

- значения флагов не совпадают со значениями системных констант;
- нет функций по обработке структур NETRESOURCE;
- излишняя (ИМХО) перегруженность функций параметрами ByRef

поэтому, поскольку уже зацепился на днях выложу свой вариант UDF

ALL
может кто еще выскажется по функциям из группы _WinNet_* ?

Maza Faka
08-07-2008, 16:54
amel27
будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы
Ну надо же! :)

поэтому, поскольку уже зацепился на днях выложу свой вариант UDF
ОК! Ждёмс... ;)

NikLok
08-07-2008, 17:45
Тут у меня спросили скрипт определения пути, куда установилась программа. У кого нибудь уже есть решение?!

Creat0R
08-07-2008, 20:26
NikLok, скрипт определения пути, куда установилась программа »
Смотря какая программа, вопрос довольно смутный, подробнее можно?

beve
08-07-2008, 22:48
Вот такой вопрос: хочу вставить условие в условие, примерно вот так:
if (MsgBox(4100, "Внимание", "Окно выбора")) = 6 Then

$sSystemDate = @MDAY & "/" & @MON
If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
EXIT
ENdif

Тоесть если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще. Но при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет. Помогите советом.

Creat0R
08-07-2008, 23:19
beve, если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще »
Можно проверять не 6, а 7, и тогда просто Exit.

при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет »
Там нехватает ещё одного EndIf в конце, т.к на каждый If .... Then должно быть EndIf (если после Then идёт перевод строки и ещё команды)...

;Первый вариант, всё находится в условии, <если нажата кнопка "Да">.
If MsgBox(4100, "Внимание", "Окно выбора") = 6 Then
$sSystemDate = @MDAY & "/" & @MON

If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
Exit
EndIf
EndIf

;Второй вариант, выход из скрипта если нажата кнопка "Нет".
If MsgBox(4100, "Внимание", "Окно выбора") = 7 Then Exit

$sSystemDate = @MDAY & "/" & @MON

If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
Exit
EndIf

Creat0R
09-07-2008, 07:06
amel27,
Не подскажешь ещё такой момент в RegExp...
Мне нужно заменить число в имени файла, тоже на число, на единицу больше, но при этом нужно оставить все остальные значения, т.е я просто решил что на каждый нужный мне кусок с имени файла будет назначена группа, а в параметре Replace она будет Использоваться, и между группами я просто подставляю нужное число, но получается что оно как бы добавляет к значению группы :wacko:

$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt", "(.*)(1)(.*)$", "\1" & $Num & "\3")
ConsoleWrite($Var)

Тут получается что используется не «\1», а «\12» :( - Как можно отменять числа в этом случае?

P.S
Без групп почему то не получается...

NikLok
09-07-2008, 10:51
Creat0R, Смотря какая программа, вопрос довольно смутный, подробнее можно? »
Да я в общем так и ответил. -
каждая программа хранит свои данные об установке в разных ключах реестра, потому универсальный скрипт вряд ли прокатит! Скорее всего придется знать ветку для каждой программы!
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\8.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf

$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\9.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf

exit


Есть более актуальный вопрос!!! Как определить ставлюсь я на виртуальной машине или на реальной!
Я использую VMWare, и пока думаю делать это проверкой наличия их видеоадаптера с VEN_15AD&DEV_0405
Как обстоят дела под другими виртуалками и каие есть готовые скрипты у кого нибудь.

Связано это с тем, что например программы работающие со SMART таблицами дисков под VMWare ставить пока вроде смысла нет, так как не эмулируются и выдаются всякие нештатные сообщения. (6.0.0 b45731)

ShaddyR
09-07-2008, 11:49
поправьте ссылку в шапке
Русская справка »
на http://www.autoitscript.com/autoit3/docs.shtml

amel27
09-07-2008, 14:30
Creat0R
Тут получается что используется не «\1», а «\12» »
да, на оффсайте поднимали эту тему неоднократно, но по-моему глухо
могу предложить обходной вариант =)
$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt" &$Num, "(.*)(1)(.*)(\d)$", "\1\4\3")
ConsoleWrite($Var&@CRLF)

Creat0R
09-07-2008, 15:02
amel27, на оффсайте поднимали эту тему неоднократно »
Вот найти бы где....

могу предложить обходной вариант
Хм.. необычный вариант :) - Но имхо, он не очень надёжный, всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра...

Я ещё так придумал:

$iFind_Num = 1
$iNum = $iFind_Num + 1

$sDelim1 = " ("
$sDelim2 = ")"

$sDelim1_RE = StringRegExpReplace($sDelim1, '([][{}()|.?+*\\^])', '\\\1')
$sDelim2_RE = StringRegExpReplace($sDelim2, '([][{}()|.?+*\\^])', '\\\1')

$Var = StringRegExpReplace("FileName (1).txt", "(.*)" & $sDelim1_RE & $iFind_Num & $sDelim2_RE, "\1" & $sDelim1 & $iNum & $sDelim2)

ConsoleWrite($Var & @CRLF)

:biggrin:

Мне просто известны заранее разделители, а вот цифра которую нужно найти и заменить может всё время меняться, а может и вовсе не существовать (просто FileName.txt).

P.S
Это я доделываю функцию _FileNewNameEx(), чтобы не получилось имён с лишними добавками (типа "FileName (1)(1).txt"). Позже выложу...

vbrv
09-07-2008, 16:43
Ситуация:
В системе два пользователя, админ и просто юзер.
Есть программа, которая может запускаться только с админскими правами.
Программа в процессе работы должна брать файлы с сетевого диска.

Что я сделал:
Залогинился под админом, сделал автомонтирование сетевого диска. Всё отлично работает, при каждом входе под админом автоподключается сетевой диск.
Скомпилировал скриптик запуска этой проги с правами админа: RunAsWait("Администратор", "org.local", "пароль", 4, "прога с полным путём").

Проблема:
Когда из под юзера запускаю эту прогу, что через скрипт, что через "Запуск от имени администратора" - программа не видит сетевой диск, лезу через Open file, а сетевой диск перечеркнут.

Вопрос:
Так и должно быть, что из под RunAs винда (vista) не автомантирует сетевой диск?
Как можно с помощью скрипта подмонтировать его? И как потом размонтировать, если это необходимо?

amel27
09-07-2008, 17:01
Creat0R
Вот найти бы где »я сходу тоже не нашел, но помню что в ответ было молчание...
всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра »угу, требуется соблюдение формата, значит придется сначала проверять обычным ReExp()
Я ещё так придумал »ну тогда можно еще в два захода - сначала заменить цифру на спецсимвол, не встречающийся в именах файлов (*?), а потом его заменить на нужную подстановку :)




© OSzone.net 2001-2012