Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
papik_bat
18-01-2007, 10:47
Здрасьте всем.
Вот история моей болезни:
я написал батник для автоматической рассылки писем, когда он срабатывает, то появляеться окно аутглюк с предуприждением, что программа пытаеться сама отправить письмо и т.д.. На нужную кнопку в этом окне я нажимал скриптом Autoit.
Opt("TrayIconHide", 1)
WinWaitActive("Microsoft Office Outlook")
Sleep(6000)
ControlClick("Microsoft Office Outlook", "", "Button4")
Send("{ENTER}")
Все работало нормально, но последнее время если компьютер заблакированн мой "нажиматель" не срабатывает, так как окно аутглюка стало теперь не активным. на писал такой скрипт:
[CODE]Opt("TrayIconHide", 1)
If WinWait("Microsoft Office Outlook") then
WinActivate("Microsoft Office Outlook","")
WinWaitActive("Microsoft Office Outlook")
Sleep(6000)
ControlClick("Microsoft Office Outlook", "", "Button4")
Send("{ENTER}")
EndIf
Но проблема не решилась, если комп заблокированн окно не активируеться и кнопка не нажимаеться.
Кто виноват? Что делать?
Diamond
Три способа определить - является ли файл папкой
Ещё один (который я до сих пор юзал):
;Возвращает -1 если файл вовсе не существует, 1 если папка, и 0 если файл....
Func _IsDir($FileName)
If FileExists($FileName) Then
$FCheck = FileOpen($FileName, 0)
If $FCheck = -1 Then
Return 1
Else
FileClose($FCheck)
Return 0
EndIf
Else
Return -1
EndIf
EndFunc
Но видимо начну юзать один из твоих примеров, тот что проверяет атрибуты, пожалуй это надёжнее.
В любом случае, исправленный код может оказаться полезным и для других участников форума.
Безусловно :)
papik_bat
если компьютер заблакированн
Что значит заблокирован? AutoIt'ом?
У тебя второй пример весь держится на условии что “скрипт будет дожидаться” окна, попробуй опустить условие и ограничить дожидание:
#NoTrayIcon ;Так надёжнее ;)
WinWait("Microsoft Office Outlook", "", 10)
;Иногда один раз не срабатывает (глюк аутоита), пробуем два раза подряд...
WinActivate("Microsoft Office Outlook")
WinActivate("Microsoft Office Outlook")
WinWaitActive("Microsoft Office Outlook", "", 10)
Sleep(6000)
ControlClick("Microsoft Office Outlook", "", "Button4")
Send("{ENTER}")
papik_bat
18-01-2007, 13:43
Продолжаем беседу...
CreatoR
Компьютер заблокирован = Ctrl+Alt+Delete -> Блокировка, либо когда блокировка включаеться автоматически.
Попробывал предложенный код, не идет...
После разблокировки окно аутлука свернуто.
papik_bat
18-01-2007, 15:58
Вот нашел описание команды которая могла бы, я думаю, решить мою беду WinRestore (http://www.dx21.com/SCRIPTING/AUTOIT/ViewItem.ASP?OID=79), но у себя в Autoit 3, ее не нахожу. Как быть?
papik_bat
у себя в Autoit 3, ее не нахожу.
Она относится к аутоиту Version 2.63, Version 2.64
Теперь (в 3.2.2) нужно так:
WinSetState("Microsoft Office Outlook", "", @SW_RESTORE)
papik_bat
19-01-2007, 10:54
CreatOR
WinSetState("Microsoft Office Outlook", "", @SW_RESTORE)
все ровно не работает.
Попробую пойти другим путем, не дам компютеру блокироваться написал скрипт Autoit "мышка летит на юг" :-)!
Через каждые 10 минут мышка двигаеться в южном направлении. Просто отключить блокировку нельзя.
Creat0R
тот что проверяет атрибуты, пожалуй это надёжнее
На самом деле все три способа надёжны!
Тот что на основе VBScript запрашивает напрямую ($fso.FolderExists() куда уж надёжней...). Там я сделал только одну поправочку. Дело в том что в VBScript, значение False понятно 0, а вот значение True = -1, поэтому я добавил Abs() для совместимости с AutoIt.
Файл "nul" - неотъемлемый элемент папки и он никуда не денется, так что тоже можно пользоваться смело. :)
Уважаемые, подскажите пожалуйста, может кто знает как реализовать на AutoIt v 3 следующее:
(Что-то сам никак не могу придумать)
1. Как вызвать меню программы, которое вызывается только по клику правой кнопкой мыши на иконку программы в трее ?
(Другого интерфейса программа не имеет...) Или как кликнуть нужную иконку программы в трее ?
Respect
как кликнуть нужную иконку программы в трее ?
Мне кажется только по координатам - используй Au3Info.exe, и нажми на нужную иконку, затем посмотри координаты которые выдаст этот инструмент (под надписью >>>Mouse Details <<< - X: и Y: ), далее используй их примерно так:
#NoTrayIcon
$X = 930
$Y = 717
MouseClick("right", $X, $Y, 1, 0)
Первая строка обязательна, иначе появится икона самого скрипта, и тогда координаты уже будут не актуальны (не верны).
Diamond
все три способа надёжны!
А если работа Vbscript нарушена в системе? ;) (у меня такое бывало)
А по поводу файла Nul, видимо он гинерируется (по крайней мере имитируется его присутствие) если существует файл с таким же имененм без расширения...
Т.е к примеру, создаём файл Test в папке C:\ (без расширения), и проверяем является ли он папкой:
$TestName = "C:\test"
MsgBox(0, "", _FolderExist($TestName))
Func _FolderExist($name)
$Folder = FileExists($name & "\nul")
Return $Folder
EndFunc
Получаем 1 (хотя это не папка) :) .
У меня есть такой вопрос:
-Возможно ли проверить функцию BlockInput()? т.е есть способ узнать, включена ли (или отключена) такая блокировка (от самого скрипта)?
Мне нужно включить BlockInput(1), и в течении того времни пока всё заблокированно, проверять были ли нажаты клавиши Alt Ctrl Del (что и вызывает отключение блокировки) - или хотябы как проверить нажатие этих клавишь, _IsPressed не помагает, не получается проверить нажатие сразу трёх клавишь :(
P.S.
И ещё такой между прочный вопрос - почему в справке нет (у меня) описании команд StringRegExp, StringRegExpReplace? где можно почитать описания, и желательно примеры этих функции? может мне справка попалась бракованная? (она шла вместе с дистрибютивом AutoIt'а).
To CreatOR К сожалению это единственный вариант, который приходит в голову и мне. Но это уже не имеет никакого отношения к автоматизации, ибо необходим универсальный способ, а на разных машинах с различным набором установленных программ
координаты конкретной иконки будут однозначно отличаться !?...
Вопрос № 2.
Как определить какая в текущий момент раскладка клавиатуры RU or EN и как переключать раскладку клавиатуры, не применяя эмуляцию нажатия клавиш ?
Наверняка не сложный вопрос, просто нет времени разбираться. Извините, если эти вопросы уже обсуждались в форуме. Хочется услышать именно ответы.
Спасибо.
Creat0R
почему в справке нет (у меня) описании команд StringRegExp, StringRegExpReplace?В папке AutoIt я нашёл 4 файла справки, все шли вместе с дистрибутивом v3.2.2.0
AutoIt, AutoIt3, AutoIt3Help, и наконец UDFs3 - (User Defined Function). В первых трёх, есть описания этих команд (у меня). :)
А если работа Vbscript нарушена в системе?В этом плане, полностью с тобой согласен, любой объектно-ориентированный язык зависим от библиотек, их регистрации в системе и т.д. Но думаю что написанный на AutoIt'е код, так же не защищён от различных неприятностей, особенно если использует внешние dll библиотеки. Например применение функций ObjCreate() и DllCall() я считаю одинаково ненадёжным. С другой стороны... если отказаться от их использования, AutoIt будет выглядеть пустым. ;)
по поводу файла NulБеру свои слова обратно. :pray: Странно... проверяется путь "C:\test\nul" и возвращается True, хотя на самом деле такого пути не существует - мистика. Раньше я использовал этот способ в батниках - как единственно возможный. А проверить его подобным образом, просто в голову не приходило... :idontnow:
Respect
необходим универсальный способ
Такого как мне кажется, в Аутоите, для этой задачи, увы нет :( .
как переключать раскладку клавиатуры, не применяя эмуляцию нажатия клавиш ?
См. в шапке AutoIt скрипты - введение и FAQ (http://oszone.net/display.php?id=3663) (Как с помощью AutoIt сменить раскладку клавиатуры).
Diamond
все шли вместе с дистрибутивом v3.2.2.0
Интересно, я установил эту версию, но поверх старой (v3.2.0.1), неужели файлы справки в таком случае не заменяются? :dont-know (в самих справках написанно v3.2.0.1).
проверяется путь "C:\test\nul" и возвращается True, хотя на самом деле такого пути не существует - мистика.
Ну это не совсем мистика, просто видимо Nul, интерпритируется как “Ничто” (также как и при проверке If FileExists("") ... ), т.е учитывается только путь до Nul (в случае с FileExists("") это путь к скрипту, ну или к рабочему каталогу).
использовал этот способ в батниках - как единственно возможный
Кстати, в батниках тоже можно “атрибутным” (почти) способом проверять :) :
@echo off
Set Dir=c:\D
If Not Exist "%Dir%" Goto ExitMsg
Attrib %Dir% > "%temp%\~6456t56iu.tmp"
For /f "delims= " %%a in (%temp%\~6456t56iu.tmp) Do If /i %%a==%Dir% (
Echo "%Dir%" Is a folder! ---^> Exit in 7 seconds ;-^) ) Else (
Echo "%Dir%" Is Not a folder! ---^> Exit in 7 seconds ;-^) )
Goto Exit
:ExitMsg
Echo This file ^<%Dir%^> was not found ---^> Exit in 7 seconds ;-)
:Exit
ping -n 7 localhost > nul
Del "%temp%\~6456t56iu.tmp"
Хотя тоже не очень наджёжно, но это уже другая тема, сорри за офтоп :blush2:
Вопрос:
Можно ли как-то заставить GUI, игнорировать (установленый в системе по умолчанию) стиль Windows XP. Т.е чтобы окно отбражалось в классическом виде (как в 98-м) не зависимо от системного стиля?
Второй вопрос:
Сущесвует ли какой нибудь простой способ претаскивания окна стиля $WS_POPUP или это возможно только за счёт слежения за позицией курсора? Кому нибудь уже удавалось двигать такое окно с помощью мыши? Я написал код, окно двигается без проблем, только вот я не уверен что это правильный способ.
#include <Guiconstants.au3>
Opt("GUIOnEventMode",1)
$test=GUICreate("",400,300,-1,-1,$WS_POPUP+$WS_BORDER)
GUISetBkColor(0xBEFFBE)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
$Closed_button=GUICtrlCreateButton("X",377,3,18,18)
GUICtrlSetFont(-1,10,700,0,"Tahoma")
GUICtrlSetOnEvent(-1,"ExitGui")
$Mim_button=GUICtrlCreateButton("-",337,3,18,18)
GUICtrlSetFont(-1,13,700,0,"Arial Black")
GUICtrlSetOnEvent(-1,"MimimizeGui")
$Max_button=GUICtrlCreateButton(CHR(152),357,3,18,18)
GUICtrlSetFont(-1,9,700,0,"Tahoma")
GUICtrlSetState(-1,$GUI_DISABLE)
$panel=GUICtrlCreateGraphic(0,0,400,24)
GUICtrlSetOnEvent(-1,"MoveWindow")
$text=GUICtrlCreateLabel("TEST",5,5,100,18)
GUICtrlSetFont(-1,12,700,0,"Courier New")
GUICtrlSetColor(-1,0xBEFFBE)
GUICtrlSetBkColor(-1,0x000000)
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10)
GUICtrlSetBkColor($panel,0x000000)
GUISetState()
While 1
Sleep(100)
WEnd
Func MoveWindow()
Opt("GUIOnEventMode",0)
$Win=WinGetPos("")
$Mouse=MouseGetPos()
$fix_X=$Mouse[0]-$Win[0]
$fix_Y=$Mouse[1]-$Win[1]
Do
$msg=GUIGetMsg()
$move=MouseGetPos()
$x=$move[0]-$fix_X
$y=$move[1]-$fix_Y
WinMove("","",$x,$y)
Until $msg=$GUI_EVENT_PRIMARYUP
Opt("GUIOnEventMode",1)
EndFunc
Func MimimizeGui()
GUISetState(@SW_MINIMIZE)
EndFunc
Func ExitGui()
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10+0x10000)
Exit
EndFunc
Creat0R
Кстати, в батниках тоже можно “атрибутным” (почти) способом проверятьДа ты оказывается Спец в батниках. :UP: Т.е. папка определяется по отсутствию отрибутов... действительно работает, спасибо!!! :)
я установил эту версию, но поверх старой (v3.2.0.1), неужели файлы справки в таком случае не заменяются?Ну, либо так как ты предположил, либо они обновили дистрибутив уже после того как ты его скачал. Я посмотрел, у меня в заголовках 3-x справок написано: v3.2.2.0 (скачивал я его, где-то после 10.01.2007)
DenchikK
22-01-2007, 18:24
Хочется узнать, как бы сделать так, чтоб скрипт искал файл qip.exe во
всём каталоге Program Files, и если таковой найдется - возвратил бы
тот каталог, в котором он лежит и запихнул бы в реестр полный путь к
катлогу (не к файлу). Это вообще осуществимо?
Заранее спасибо!
Diamond
Можно ли как-то заставить GUI, игнорировать (установленый в системе по умолчанию) стиль Windows XP
Такого конкретного стиля (кажется) нет, но можно вручную это делать, почти также как ты это сделал с примером для следующего вопроса ;)
Сущесвует ли какой нибудь простой способ претаскивания окна стиля $WS_POPUP
Есть стил $GUI_WS_EX_PARENTDRAG, его нужно “вешать” например на GuiCtrlCreateLabel, и тогда можно перетаскивать окно тягая этот контроль:
#include <Guiconstants.au3>
Opt("GUIOnEventMode",1)
$test=GUICreate("",400,300,-1,-1,$WS_POPUP+$WS_BORDER)
GUISetBkColor(0xBEFFBE)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
$Closed_button=GUICtrlCreateButton("X",377,4,18,18)
GUICtrlSetFont(-1,10,700,0,"Tahoma")
GUICtrlSetOnEvent(-1,"ExitGui")
$Mim_button=GUICtrlCreateButton("-",337,4,18,18)
GUICtrlSetFont(-1,13,700,0,"Arial Black")
GUICtrlSetOnEvent(-1,"MimimizeGui")
$Max_button=GUICtrlCreateButton(CHR(152),357,4,18,18)
GUICtrlSetFont(-1,9,700,0,"Tahoma")
GUICtrlSetState(-1,$GUI_DISABLE)
$text=GUICtrlCreateLabel("Manual GUI Drag",5,5,325,18, $SS_Center, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1,12,700,0,"Courier New")
GUICtrlSetColor(-1,0xBEFFBE)
GUICtrlSetBkColor(-1,0x000000)
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10)
GUISetState()
While 1
Sleep(100)
WEnd
Func MimimizeGui()
GUISetState(@SW_MINIMIZE)
EndFunc
Func ExitGui()
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10+0x10000)
Exit
EndFunc
либо они обновили дистрибутив уже после того как ты его скачал
Ладно, спасибо, попробую ещё раз перекачать и установить.
DenchikK
чтоб скрипт искал файл qip.exe во
всём каталоге Program Files, и если таковой найдется - возвратил бы
тот каталог, в котором он лежит и запихнул бы в реестр полный путь к
катлогу (не к файлу).
Вот рабочий пример, путь в реестре куда писать, поменяешь у переменной $RegKey, а имя значения у переменной $RegValueName:
#include <File.au3>
#include <Array.au3>
$PathForSearch = @ProgramFilesDir
$FileToFind = "Qip.exe"
$RegKey = "HKEY_CURRENT_USER\Software\QIP"
$RegValueName = "Path"
ProgressOn("Please wait...", "Getting Folders Structure...", $PathForSearch, -1, -1, 16)
$SearchResults = _FileFind($PathForSearch, $FileToFind)
ProgressOff()
If $SearchResults <> -1 Then
RegWrite($RegKey, $RegValueName, "REG_SZ", $SearchResults)
MsgBox(262144+64, "Done!", "File <" & $FileToFind & "> was found in this path <" & $SearchResults & ">, and the path was writen to registry key <" & $RegKey & "> under <" & $RegValueName & "> valuename.")
Else
MsgBox(262144+48, "Attention!", "File <" & $FileToFind & "> was not found on <" & $PathForSearch & "> and it subfolders." & @CR & @CR & "OK ---> EXIT")
EndIf
Func _FileFind($Path, $FileToFind)
Local $RetPath = $Path
If FileExists($Path & "\" & $FileToFind) Then Return $Path
$SubFoldersArr = _DirListToArray($Path)
If IsArray($SubFoldersArr) Then
$PrgrsDelim = 100 / $SubFoldersArr[0]
$Prgrrs = $PrgrsDelim
ProgressSet($Prgrrs, $Path, "Search for <" & $FileToFind & "> is in process...")
For $iF = 1 To $SubFoldersArr[0]
ProgressSet($Prgrrs, $SubFoldersArr[$iF])
$Prgrrs = $Prgrrs + $PrgrsDelim
If FileExists($SubFoldersArr[$iF] & "\" & $FileToFind) Then
$RetPath = $SubFoldersArr[$iF]
ExitLoop
EndIf
Next
EndIf
If $RetPath <> $Path Then
Return $RetPath
Else
Return -1
EndIf
EndFunc
Func _DirListToArray ($sPath)
Local $i, $j, $rlist[1]=[0], $blist, $alist=_FileListToArray ($sPath, '*', 2)
If IsArray ($alist) Then
For $i=1 To $alist [0]
_ArrayAdd ($rlist, $sPath & "\" & $alist [$i])
$blist = _DirListToArray ($sPath & "\" & $alist [$i])
If $blist[0] > 0 Then
$PrgrsDelim = 100 / ($blist[0] + $alist[0])
$Prgrrs = $PrgrsDelim
For $j=1 To $blist[0]
ProgressSet($Prgrrs, $blist[$j])
$Prgrrs = $Prgrrs + $PrgrsDelim
_ArrayAdd ($rlist, $blist[$j])
Next
EndIf
Next
EndIf
$rlist [0] = UBound ($rlist) - 1
Return $rlist
EndFunc
Если ненужен вывод прогресса, просто убери строчки связанные с Progress ;)
DenchikK
Creat0R
К сожалению, а может и к радости, мне не удалось найти уже готового решения и я решил написать функцию поиска сам.
А сейчас захожу на форум и, вот тебе раз, опоздал... Ну да ладно... как вам такой вариант, вроде бы тоже ничего? :blush2:
P.S. Есть ещё перебор через VBScript с помощью ObjCreate(). Если интересно - выложу. :)
$ret = find(@ProgramFilesDir,"qip.exe")
If Not $ret=0 Then
MsgBox(0,"",$ret)
; Записываем значение $ret в реестр...
Else
MsgBox(0,"","Файл не найден.")
EndIf
;=================================
; $Path - Путь поиска. ( Не должен заканчиваться слэшем!!! )
; $FileName - Имя искомого файла.
; Возвращает полный путь к каталогу (не к файлу), если файл осутствует возвращает 0
Func find($Path,$FileName)
If Not IsDeclared("GetPath") Then
Global $GetPath=0
EndIf
$ModPath=$Path & "\*" ; Формирую строку поиска (толко для инициализации)
$file=FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
$get=FileFindNextFile($file) ; Поиск...
If @error Then ExitLoop
$string=$Path & "\" & $get ; Формирую новый путь
If Not StringInStr(FileGetAttrib($string),"D") Then ;Если не является папкой тогда:
If $get=$FileName Then
$GetPath=$Path
ExitLoop
EndIf
Else
find($string,$FileName) ; Запуск подфункции для поиска в подпапке
EndIf
WEnd
FileClose($file) ;Завершение инициализации
Return $GetPath
EndFunc
Исправлено!
Такой вопрос:
-Возможно ли получить иконку из файла, в случае если расширение файла не зарегистрированно в системе? Т.е мне нужно сделать GuiCtrlSetImage(), и указать так, чтобы та иконка которая отображается на файле, была считана для контроля ($CtrlID).
К примеру, есть файл Program.exe, известно что далеко не все исполняемые файлы (и другие) содержат иконку, и нужно каким то образом определить, содержит ли этот файл иконку, если не содержит, то естественно путь к иконке можно указать к Shell32.dll, 2 (где 2 это ID иконки для екзешников не содержащих иконки), если содержит, то к самому файлу, и как ID ставить 0. А если файл не исполняемы, то можно по расширению читать из реестра путь к иконке.
Вобщем-то сам вопрос - Как узнать, содержит ли файл иконку? и по возможности, получить путь к иконке для не зарегистрированных типов файлов.
Diamond
вроде бы тоже ничего?
Вроде бы? :o а теперь засекай время поиска моей функции (часть которой является также и функция от amel27 - _DirListToArray()), и время для поиска которое уходит у твоей функции, результат шокирующий (меня) - Мой скрипт ищет (у меня на компе, с моей кучей программ) ровно 16 секунд, твой, ровно в два раза быстрее! 8 секунд! :UP: я понимаю что ProgressSet занимает время, но я сравнивал “голые” функции в действии, и тоже в два раза твоя оказалась быстрее.
Правда есть пару минусов - нет возможности заранее получить общее количество найденых папок (для точного подсчёта прогрессбара, или вывода прочей информации), также нельзя искать по маске, или ставить случайно слеш после пути :tongue: . Но в данном случае, если требуется произвести исключительно поиск, то этот (твой) вариант идеальный! :up:
P.S.
Немного изменил гуи для перетаскивания (http://forum.oszone.net/showthread.php?p=539972#post539972), и код для поиска (http://forum.oszone.net/showthread.php?p=540004#post539974) (там в самой функции случайно указал \qip.exe :blush2: ).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.