Войти

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

trigun
02-07-2007, 16:35
всем привет.
у меня тут такая проблемка возникла. Не могу понять как заставить программу считывать нажатую клавишу...
подскажите плз как начать обработку события.

пишу небольшой скриптик для сидюка.
кому интересно(вот исходник):

CDTray("K:", "open")
Sleep(500)
MsgBox(0,"insert disk","вставте диcк")
WinActivate("insert disk")
WinWaitClose("insert disk")
CDTray("K:","close")
MsgBox(4,"inf","Хотите посмотреть информацию о диске?")
WinActivate("inf")
$var=DriveGetFileSystem("K:")
MsgBox(0,"info","файловая система диска:"& $var)
WinActivate("info")
WinWaitClose("info")

$1= DriveGetLabel("K:")
msgbox(0,"info1","Заголовок диска:"& $1)
WinActivate("info1")
WinWaitClose("info1")
$2=DriveGetSerial("K:")
MsgBox(0,"info2","серийный номер диска:"& $2)
WinActivate("info2")
WinWaitClose("info2")
$3=DriveSpaceFree("K:")
msgbox(0,"info3","свободного места: "& $3 & " MB")
WinActivate("info3")
WinWaitClose("info3")
$4=DriveSpaceTotal("K:")
MsgBox(0,"info4","всего места на диске: " & $4 & " MB")
WinActivate("info4")

Dirk Diggler
02-07-2007, 19:35
как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?

Sandro Half-Dead
02-07-2007, 19:51
Не знаю, может и был вопрос...
Возможно ли с помощью AutoIT послать клик мыши в неактивное окно (возможно и вовсе не видное на экране (не свёрнутое, но закрытое другим))??? Если можно, то как???

ChVL
02-07-2007, 20:52
Sandro Half-Dead
Всё, куда можно послать, Вам покажет программа AutoIt Window Info. Другого не дано.

Creat0R
02-07-2007, 22:10
GTeam
msgbox, выдает верный урл
Моя вина, сори, замени 4-тую строку в примере на эту:

$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*/", "")

Я перепутал направление слешев, забыл что это урл в сети :shuffle:

trigun
как заставить программу считывать нажатую клавишу
Я так понял тебе нужно узнать что нажал юзер в MsgBox?
У тебя в примере скрипт ожидает закрытия окна MsgBox... но пока на экране виден MsgBox, скрипт останавливается, поэтому все функции после него будут запущены только после его закрытия.

См. справку по MsgBox(), эта команда возвращает значения, вот пример:

$Ret = MsgBox(36, "Title", "Вы подтверждаете?")
If $Ret = 6 Then MsgBox(0, "", "Да, вы подтвердили :)")
If $Ret = 7 Then MsgBox(0, "", "Нет, вы не хотите подтверждать :)")


Dirk Diggler
как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?
я как то на оф. форуме встречал подобну функцию (возвращает нужную длину для смены элемента основываясь на новом тексте), но к сожалению пока не могу найти где :(, как только найду отпишусь.

amel27
03-07-2007, 07:10
Diamondне знаю как получить mof-описание для каждого метода или свойства по отдельности может просто пропарсить текст?#include <array.au3>
_ArrayDisplay(GetObjDescriptions("root\cimv2","Win32_Service"),'Win32_Service')

Func GetObjDescriptions($strNameSpace, $strClass, $strComputer = ".")
Local $objWMIService, $objClass, $strMOF, $array, $num, $out
Local Const $wbemFlagUseAmendedQualifiers = 0x20000
Local Const $regExp = '\s\[(?:\\\]|[^]])*?Description\("((?:\\"|[^"])*)"(?:\\\]|[^]])*\] \w+ (\w+)'

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
$strComputer & "\" & $strNameSpace)
$objClass = $objWMIService.Get($strClass, $wbemFlagUseAmendedQualifiers)
$strMOF = $objClass.GetObjectText_
$array = StringRegExp($strMOF, $regExp, 3)
$num = UBound($array)/2
Dim $out[$num+1][2] = [[$num]]
For $i=1 To $num
$out[$i][0] = $array[$i*2-1]
$out[$i][1] = $array[$i*2-2]
Next
Return $out
EndFunc

Dirk Diggler
03-07-2007, 19:16
Вот такую библиотеку накалякал. Кому пригодится - пользуйтесь. Брать здесь (http://tega.ru/dirk/download.html) .

Func _FileGetFileName($path) ; выделяет из полного пути и возвращает имя файла
Func _FileGetDirPath($path) ; выделяет из полного пути и возвращает имя директории
Func _GetDocumentsAndSettingsDir() ; возвращает полный путь к папке "Documents And Settings"
Func _GetProfilesPath() ; возвращает массив строк с полными ключами к профилям пользователей этого компьютера
Func _LocalGroupExist($us) ; Проверяет, существует ли ЛОКАЛЬНАЯ ГРУППА С ТАКИМ ИМЕНЕМ. возвращает ИСТИНУ/ЛОЖЬ
Func _LocalUserExist($us) ; Проверяет, существует ли ЛОКАЛЬНЫЙ ПОЛЬЗОВАТЕЛЬ С ТАКИМ ИМЕНЕМ. возвращает ИСТИНУ/ЛОЖЬ
Func _GetDomainOrWorkGroup() ; ВЕРНЕТСЯ ИМЯ ДОМЕНА, если не в домене - то рабочей группы.
Func _GetWorkgroup() ; ТОЛЬКО РАБОЧАЯ ГРУППА, ДЛЯ ДОМЕННОГО КОМПА ВЕРНЕТСЯ ПУСТАЯ СТРОКА
Func _JOINWORKGROUP($WG) ; вводит компьютер в Рабочую группу (имя передается параметром)
Func _ShareFolder($dir,$name, $comment = '') ; создает общий ресурс.
Func _GetShareInfoByNumber($i) ; Возвращает массив с инфой о шаре № $i или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _GetShareInfoByName($name) ; Возвращает массив с инфой о шаре с данным именем или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _GetShareInfoByPath($path) ; Возвращает массив с инфой о шаре данного каталога или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _NoActiveStaticIP() ; возвращает истину/ложь. Если нет IP на рабочей, подключенной и т.п. карте
Func _AllNetworkDevicesDisabled() ; возращает истину-ложь
Func _RunVBS($vbs) ; запускает VBS-скрипт , переданный ему в кач-ве параметра.
Func _RenameComputer($name) ; переименовывает компьютер
Func _GetShortUserName($_user) ; возвращает короткое имя пользователя - т.е. для tega@office.local или OFFICE\tega результатом будет tega
Func _CreateLocalGroup($gn) ; создает локальную группу с указанным именем
Func _CreateLocalUser($us,$passw='') ; создает локального пользователя с указанным именем и паролем
Func _ListLocalGroups($username) ; Возвращает массив со списком локальных групп, членом которых является указанный пользователь
Func _JoinLocalgroup($us,$gr) ; добавляет пользователя в указанную локальную группу.
Func _DomainUserInLocalGroup($UserName, $InGroup, $Domain='') ; проверяет, является ли пользователь членом локальной группы
Func _GetStartedServicesAndDrivers() ; возвращает массив из имен запущенных сервисов и драйверов.
Func _GetStartedServices() ; возвращает массив из имен запущенных сервисов.
Func _GetStartedDrivers() ; возвращает массив из имен запущенных системных драйверов.
Func _HostIsOk($host_) ; проверяет, пингуется ли хост. Возвр. истину-ложь
Func _TCPServiceIsOk($_addr,$_port=0); Проверяет порт путем установления к нему соединения.возращает истину-ложь .
Func _UDPServiceIsOk($_addr,$_port=0) ; Проверяет порт путем установления к нему соединения.возращает истину-ложь .
Func _GetDns(ByRef $_dns1,ByRef $_dns2) ; заполняет переменные значениями и возвращает 0. В случае ошибки возвращает -1
Func _GetGateWay() ; возвращает адрес шлюза по умолчанию
Func _GetIEProxy() ; возвращает настройки прокси-сервера из Internet Explorer в виде строка "ip-адрес:порт"
Func _StringIsIp($str) ; проверяет, является ли строка ip-адресом. Возвр. истину-ложь
Func _StringIsEmpty($str) ; проверяет, является ли строка пустой. Возвр. истину-ложь
Func _HTTPget($url, $ProxyServer='', $ProxyUser = '' , $ProxyPass = '', $UseIntegratedSecurity = False) ; возвращает текст, полученный методом get протокола HTTP. Устанавливает флаг ошибки @error=0 в случае успеха, -1 в случае неудачи.
Func _HTTPSetTimeOuts($tResolve = 30000,$tConnection = 30000,$tSendTimeout = 30000,$tReceive = 30000) ; устнавливает таймауты для HTTP-запроса

Creat0R
04-07-2007, 04:43
Dirk Diggler
как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?
как только найду отпишусь.
Нашёл! (http://www.autoitscript.com/forum/index.php?showtopic=13733&view=findpost&p=200715)


Вот пример использования:


#include <GUIConstants.au3>
$text = "Text Label"

$hGui = GUICreate("Test Label Size")
$Label_1 = GUICtrlCreateLabel($text, 20, 20)
GUICtrlSetFont(-1, 9, 400, 0, "Tahoma")

$Button = GUICtrlCreateButton("Change Label", 20, 300)

GUISetState()

While 1
Switch GUIGetMsg()
Case -3
Exit
Case $Button
$Text &= " and some more text, "
GUICtrlSetData($Label_1, $Text)
$TextLenght = _GetTextLabelWidth($Text, "Tahoma", 9)
GUICtrlSetPos($Label_1, 20, 20, $TextLenght)
EndSwitch
WEnd

Func _GetTextLabelWidth($s_WinText, $s_TextFont, $i_FontSize, $i_FontWeight = -1)
Local Const $DEFAULT_CHARSET = 0 ; ANSI character set
Local Const $OUT_CHARACTER_PRECIS = 2
Local Const $CLIP_DEFAULT_PRECIS = 0
Local Const $PROOF_QUALITY = 2
Local Const $FIXED_PITCH = 1
Local Const $RGN_XOR = 3
Local Const $LOGPIXELSY = 90

$h_WinTitle = "Get Label Width"
If $i_FontWeight = "" Or $i_FontWeight = -1 Then $i_FontWeight = 600 ; default Font weight
Local $h_GUI = GUICreate($h_WinTitle, 10, 10, -100, -100, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW)
Local $hDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $h_GUI)

Local $intDeviceCap = DllCall("gdi32.dll", "long", "GetDeviceCaps", "int", $hDC[0], "long", $LOGPIXELSY)
$intDeviceCap = $intDeviceCap[0]

Local $intFontHeight = DllCall("kernel32.dll", "long", "MulDiv", "long", $i_FontSize, "long", $intDeviceCap, "long", 72)
$intFontHeight = -$intFontHeight[0]

Local $hMyFont = DllCall("gdi32.dll", "hwnd", "CreateFont", "int", $intFontHeight, _
"int", 0, "int", 0, "int", 0, "int", $i_FontWeight, "int", 0, _
"int", 0, "int", 0, "int", $DEFAULT_CHARSET, _
"int", $OUT_CHARACTER_PRECIS, "int", $CLIP_DEFAULT_PRECIS, _
"int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $s_TextFont)
DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $hDC[0], "hwnd", $hMyFont[0])

Local $res = DllStructCreate("int;int")

Local $ret = DllCall("gdi32.dll", "int", "GetTextExtentPoint32", "int", $hDC[0], "str", $s_WinText, "long", StringLen($s_WinText), "ptr", DllStructGetPtr($res))

Local $intLabelWidth = DllStructGetData($res,1)

GUIDelete($h_GUI)
Return $intLabelWidth
EndFunc

Diamond
04-07-2007, 05:05
amel27
может просто пропарсить текст?Потрясающе!!! Как раз то что мне и было нужно, даже больше! :UP:
Теперь я смогу написать gui для просмотра WMI - пространств имён и классов, которое (на мой взгляд) будет удобней всяких scriptomatic2 и подобных ему программ.
Огромное спасибо!

Creat0R
04-07-2007, 09:50
Dirk Diggler
Func _FileGetFileName($path)
Имхо, намного проще использовать RegExp:
StringRegExpReplace($path, "^.*\\", "")

Func _FileGetDirPath($path)
Тоже самое и тут:
StringRegExpReplace($Path, '\\[^\\]*$', '')

Func _StringIsEmpty($str)
А чем плоха встроенная функция StringIsSpace ($str)? :shuffle:

Dirk Diggler
04-07-2007, 12:08
А чем плоха встроенная функция StringIsSpace ($str)?

она возвращает число, это раз, а во вторых, я когда писал ту функцию, попросту не знал о существовании этой.

а регэкпы - это конечно, хорошо.

Creat0R
08-07-2007, 05:55
amel27
Помню как то ты упоминал о CallBack функциях, не знаю насколько ты следишь за оф. форумом, но думал может пригодится - там обсуждают какие то новые открытия для AutoIt связанные с CallBack, топик так и назвали - CallBack (http://www.autoitscript.com/forum/index.php?showtopic=48225) :) (последний пост сегодня, picasso предложил раньше решение без использования сторонних Dll'ок, вот он и делится архивом полный примеров) - Там штурмуют по моему лучшие ума AutoIt'а ;)

Creat0R
08-07-2007, 06:11
На оф. форуме нашёл способ проверки нажатии какой либо клавиши (http://www.autoitscript.com/forum/index.php?showtopic=48579&view=findpost&p=366044), давно искал...

Правда там используется файл, с которого берутся (не)всевозможные варианты для клавиш, вот я и решил переделать тот пример в функцию, и вот что получилось:



While 1
$KeyIsPressed = _KeyIsPressed()
If $KeyIsPressed Then MsgBox(64, "Pressed/Clicked:", $KeyIsPressed)
Sleep(10)
WEnd

Func _KeyIsPressed()
Local $KeyBoardLayoutArr = StringSplit("{LMouse}|{RMouse}|{}|(MMouse}|{}|{}|{}|{BACKSPACE}|{TAB}|{}|{}|{}|{ENTER}|{}|{}|{SHIFT}|{CTRL}|{ALT} |{PAUSE}|{CAPSLOCK}|{}|{}|{}|{}|{}|{}|{ESC}|{}|{}|{}|{]|{SPACE}|{PGUP}|{PGDN}|{END}|{HOME}|{LEFT}|{UP}|{RIGHT}|{DOWN}|{SELECT}|{PRINTSCREEN}|{}|{PRINTSCREE N}|{INSERT}|{DEL}|{}|0|1|2|3|4|5|6|7|8|9|{}|{}|{}|{}|{}|{}|{}|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s| t|u|v|w|x|y|z|{LWIN}|{RWIN}|{APPSKEY}|{}|{SLEEP}|{numpad0}|{numpad1}|{numpad2}|{numpad3}|{numpad4}|{ numpad5}|{numpad6}|{numpad7}|{numpad8}|{numpad9}|{NUMPADMULT}|{NUMPADADD}|{}|{NUMPADSUB}|{NUMPADDOT} |{NUMPADDIV}|{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}|{F13}|{F14}|{F15}|{F16}| {F17}|{F18}|{F19}|{F20}|{F21}|{F22}|{F23}|{F24}|{}|{}|{}|{}|{}|{}|{}|{}|{NUMLOCK}|{}|{}|{}|{}|{}|{}| {}|{}|{}|{}|{}|{}|{}|{}|{}|{SHIFT}|{SHIFT}|{CTRL}|{CTRL}|{ALT}|{ALT}|{BROWSER_BACK}|{BROWSER_FORWARD }|{BROWSER_REFRESH}|{BROWSER_STOP}|{BROWSER_SEARCH}|{BROWSER_FAVORITES}|{BROWSER_HOME}|{VOLUME_MUTE} |{VOLUME_DOWN}|{VOLUME_UP}|{MEDIA_NEXT}|{MEDIA_PREV}|{MEDIA_STOP}|{MEDIA_PLAY_PAUSE}|{LAUNCH_MAIL}|{ LAUNCH_MEDIA}|{LAUNCH_APP1}|{LAUNCH_APP2}|{}|{}|;|{+}|,|{-}|.|/|`|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|[|\|]|'", "|")
Local $a_R
For $i = 0 To 165
$a_R = DllCall("user32.dll", "int", "GetAsyncKeyState", "int", '0x' & Hex($i,2))
If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return $KeyBoardLayoutArr[$i]
Next
Sleep(40)
Return 0
EndFunc



Если было что-то нажато, возвращается нажатая клавиша (или даже кнопка мышки), если ничего не нажимается (при проверке в цикле), возвращается 0.

P.S
Просчитать ВСЕ возможные нажатия клавиш, мне увы, не удалось :(.

Dirk Diggler
08-07-2007, 16:12
Как из AutoIt открыть ссылку в дефолтном браузере?

Creat0R
08-07-2007, 16:32
Dirk Diggler
Как из AutoIt открыть ссылку в дефолтном браузере?

ShellExecute("http://forum.oszone.net")

proxy
09-07-2007, 05:48
Доброе утро всем =))

есть файл1 и файл2
в фале2 описанна функция какая-нибуть
а в фале1 вызов этой функции

в autoit это вообще реально?

т.е. запустить файл1 и из него считать функцию из файла2
и вернуть данные на обработку обратно файл1 .. - ?

amel27
09-07-2007, 06:24
Creat0Rpicasso предложил раньше решение без использования сторонних Dll'окда, видел... не слежу - случайно наткнулся :) ... Первая версия (через DLL) была несовместима с диалоговыми API-функциями, последний вариант пока пробовал... Однако, конкуренция с AutoHotkey пошла на пользу. ;)

proxy
собственно, макрос #include как раз и загружает функции, определенные в других AU3-файлах, примеры смотри в справке или тут на форуме... А что значит "вернуть данные на обработку обратно файл"?.. данные читаются и записываются в файл, а обрабатываются "процессом" (или точней - "потоком").

Creat0R
09-07-2007, 06:48
amel27
макрос #include как раз и загружает функции, определенные в других AU3-файлах
Немного дополню...

Загружать он (макрос) умеет не только AU3-файлы, но и любые(?) другие текстовые файлы ;) (к примеру: #Include "MyFunctions.fnc").

Dirk Diggler
10-07-2007, 15:00
как прочитать/установить права NTFS на папку\файл?? Я даже это в микрософтовском vbs-репозитории не нашел.

amel27
11-07-2007, 08:10
Dirk DigglerЯ даже это в микрософтовском vbs-репозитории не нашелhttp://download.microsoft.com/download/a/1/a/a1afc045-4b65-4a0a-817c-9110b99f542d/Scripting_Security_Descriptors.doc
http://www.microsoft.com/technet/technetmag/issues/2006/05/ScriptingGuy/default.aspx?rss=http://www.microsoft.com/technet/technetmag/issues/2006/05/ScriptingGuy&loc=ru :)




© OSzone.net 2001-2012