Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
HORRIBLE,
а откуда берутся данные, что я нажал на кнопку деления
Простая запись имени контроля...
$aOperations_Arr[$iUbound] = GUICtrlRead($nMsg, 1)
Тут где GUICtrlRead($nMsg, 1), используется дополнительный параметр (1), позволяющий считывать текст с элемента.
Просто в массив записываем этот текст, и когда делается подсчёт (Execute()), то соответствующая операция будет выполнена... да, если создать кнопку с другим именем, то подсчёт будет не корректный.
Kenwood3D
подсажите решение первой проблемы здесь
Оказывается в моей функции есть ошибка, а точнее неточность проверки ошибочности :clever-ma
Нужно в фунцию _ControlTab() добавить это перед Swith $sCommand...
If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
If Not WinExists($hWnd) Then Return SetError(1, 0, "")
По поводу решения, вот это у меня работает:
#include <ControlTab.au3>
$ConnPropTitle = 'Подключение по локальной сети'
_OpenConnProperties($ConnPropTitle)
WinWaitActive($ConnPropTitle)
ControlClick($ConnPropTitle, "", "Button1")
$PropTitle = "[REGEXPTITLE:Свойства:.*]"
WinWaitActive($PropTitle)
$Index = _ControlTab($PropTitle, "", "FindTab", "Дополн", 0, True)
_ControlTab($PropTitle, "", "TabSelect", $Index)
ControlCommand($PropTitle, "", "ListBox1", "SelectString", "Network Address")
Sleep(5000)
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $Item
For $Item In $oCP.Items
If $Item.name = 'Сетевые подключения' Then
For $Item In $Item.Getfolder.Items
If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
Next
EndIf
Next
EndFunc
Как проверить наличие или отсутсвие флага
If BitAND(GUICtrlRead($Ctrl), $GUI_CHECKED) Then
....
EndIf
;)
Kenwood3D
15-12-2007, 19:40
Creat0R,
Оказывается в моей функции есть ошибка, а точнее неточность проверки ошибочности
Нужно в фунцию _ControlTab() добавить это перед Swith $sCommand...
Код:
If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
If Not WinExists($hWnd) Then Return SetError(1, 0, "") »
Добавил. Не помогло. Также не работает по названиям закладок. Проверял на другом компе, тоже не хочет. Может чушь, а не может быть дело в стиях ХР?
ControlCommand($PropTitle, "", "ListBox1", "SelectString", "Network Address") »
Работает! Спасибо! :D
If BitAND(GUICtrlRead($Ctrl), $GUI_CHECKED) Then
....
EndIf »
А вот тут не понял куда что. У меня галочка называется Button2. И как связать?
Kenwood3D
15-12-2007, 20:55
Вобщем, проверку наличия галочки выполнил, оказалось, простым способом
ControlCommand("Заголовок окна", "", "Button2", "IsChecked")
Kenwood3D, Не помогло
Обычный пример работет?
#include <GUIConstants.au3>
#include <ControlTab.au3>
$GUI = GUICreate("ControlTab Demo")
GUICtrlCreateTab(0, 20)
$Tab_1 = GUICtrlCreateTabItem("Tab 1")
GUICtrlCreateLabel("Some Text", 10, 60)
$Tab_2 = GUICtrlCreateTabItem("Tab 2")
$Tab_3 = GUICtrlCreateTabItem("More Tab")
GUISetState()
For $i = 0 To _ControlTab($GUI, "", "GetTabsCount")-1
MsgBox(0, "", "Zero-Based tab number [" & $i & "]: " & @LF & _ControlTab($GUI, "", "GetItemText", $i), 2)
_ControlTab($GUI, "", "TabRight", 1)
Next
У меня галочка называется Button2
Я думал нужно проверить у аутоитовского GUI ;)
Задача была не ясна.
Maza Faka
16-12-2007, 07:19
Creat0R
Зеркало
Ссылка битая, залей на slil.ru
Creat0R
Прикрепляю первую версию самодельной функции для копирования папок вместе с их содержимым...
Две проблемы которые нужно решить:
1) Более точный подсчёт оставшегося до окончания копирования времени (мне кажтся у меня вообще неверный подсчёт, делал давно).
2) AVI-Анимация останавливается на время копирования большого файла - это можно было бы решить если создание всего GUI повесить на отдельный скрипт, но тогда будет висеть два процесса для одной задачи »
Думаю проблемы решаемы, но скрипт очень сырой и сначала нужно привести в порядок то что уже есть... к примеру файлы, вложенные в подкаталоги не копируются так как перед вызовом _FileCopyEx() нужно сначала создать структуру каталогов - CopyFileExA каталоги создавать не может... Функция _FileListToArrayEx() тоже работает странно - в такой ее реализации нет смысла в маске, так как она применяется к каталогам и тем самым отменяет поиск в подкаталогах, тут возможны варианты в зависимости от того что требуется от функции... Синхронизация копирования и обновления GUI тоже имхо слишком запутанна - одновременно применяются разные способы GUIGetMsg(), GUIGetCursorInfo(), GUIRegisterMsg() насколько это необходимо?... ну и по мелочам ;) ... Кстати, замедление скрипта никак не связано с использованием CallBack, просто нет смысла обновлять GUI для каждого блока данных... имхо нужно либо ставить пропуски (по счетчику) либо обновлять ГУИ по таймеру.
Maza Faka,
залей на slil.ru
Слил (http://slil.ru/25241977) - Но скоро перезалью, нашёл пару битых ссылок (в меню форума), а также нужно добавить пару фич.
amel27, файлы, вложенные в подкаталоги не копируются
Странно, у меня всё копируется.
CopyFileExA каталоги создавать не может
Поэтому у меня _FileCopyEx() создаёт их по запросу :)
она применяется к каталогам и тем самым отменяет поиск в подкаталогах
У меня функция возвращает подкаталоги и файлы в них, использовал именно эту функцию т.к хотел обойти необходимость в рекурсии.
насколько это необходимо?
Эти строчки можно убрать:
$aCurInfo = GUIGetCursorInfo($hCopyProgrss_GUI)
If IsArray($aCurInfo) And $aCurInfo[2] = 1 And $aCurInfo[4] = $Cancel_Button Then ExitLoop
Это я забыл, они использовались раньше для определения отмены копирования.
нет смысла обновлять GUI для каждого блока данных
Он обновляется по необходимости, т.е файл копируется, и соответственно обновляются данные.
Мне интересно решить проблему с _GetTimeRemained(), я теперь уверен что моё “древнее” решение совсем неверно, подсчёт не должен происходить на основе количества копируемых файлов и определённом (зарание) уровне (для суммы файлов).
Kenwood3D
17-12-2007, 00:14
Обычный пример работет? »
Работает. Дело в том что у меня работают все команды ControlTab.au3, кроме тех, которые касаются текста - названия закладки. Т.е. не считывает название закладки и не переключает по названию, а остальные команды работают.
Kenwood3D, кроме тех, которые касаются текста - названия закладки
Но в этом примере тоже задействована команда GetItemText, если она тут (с моим примером) работает, значит проблема где то в системе :dont-know
Подскажите пожалейста Как можно растянуть и зафиксировать панель задач на две строки (желательно, чтобы квикланч оказался сверху, а открытые программы - снизу).
Maza Faka
18-12-2007, 07:48
DImaN!
По моему с таким вопросом тебе в другой топик.
Эффект пристыковки GUI-окна к краям экрана или даже к краям других окон:
#include <GUIConstants.au3>
Global Const $WM_WINDOWPOSCHANGING = 0x0046
Global $nRange = 20
$hGUI = GUICreate("GUI Stickable!", 280, 150)
$Stickable_CB = GUICtrlCreateCheckbox("Stickable?", 20, 30)
GUICtrlSetState(-1, $GUI_CHECKED)
$Range_Input = GUICtrlCreateInput($nRange, 20, 60, 40, 20, $ES_READONLY)
$UpDown = GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 80, 5)
GUISetState()
GUICreate("Some extra window", 320, 180, 0, 0)
GUIRegisterMsg($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING")
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Stickable_CB
If GUICtrlRead($Stickable_CB) = $GUI_CHECKED Then
GUIRegisterMsg($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING")
Else
GUIRegisterMsg($WM_WINDOWPOSCHANGING, "")
EndIf
Case $UpDown
$nRange = GUICtrlRead($Range_Input)
EndSwitch
WEnd
Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam)
Local $IsSideWinStick = True ;Set to True for sticking to all visible windows :) - but it's hangs up CPU :(
Local $stWinPos = DllStructCreate("uint;uint;int;int;int;int;uint", $lParam)
Local $nLeft = DllStructGetData($stWinPos, 3)
Local $nTop = DllStructGetData($stWinPos, 4)
Local $aCurWinPos = WinGetPos($hWnd)
Local $aWorkArea = _GetWorkingArea()
;Left
If Abs($aWorkArea[0] - $nLeft) <= $nRange Then DllStructSetData($stWinPos, 3, $aWorkArea[0])
;Right
If Abs($nLeft + $aCurWinPos[2] - $aWorkArea[2]) <= $nRange Then DllStructSetData($stWinPos, 3, $aWorkArea[2] - $aCurWinPos[2])
;Top
If Abs($aWorkArea[1] - $nTop) <= $nRange Then DllStructSetData($stWinPos, 4, $aWorkArea[1])
;Bottom
If Abs($nTop + $aCurWinPos[3] - $aWorkArea[3]) <= $nRange Then DllStructSetData($stWinPos, 4, $aWorkArea[3] - $aCurWinPos[3])
If Not $IsSideWinStick Then Return 0
Local $ahWnd = WinList()
For $i = 1 To UBound($ahWnd) - 1
If $ahWnd[$i][1] = $hWnd Or Not BitAND(WinGetState($ahWnd[$i][1]), 2) Or _
BitAND(WinGetState($ahWnd[$i][1]), 32) Or BitAND(WinGetState($ahWnd[$i][1]), 16) Then ContinueLoop
$aSideWinPos = WinGetPos($ahWnd[$i][1])
If $aCurWinPos[1] + $aCurWinPos[3] >= $aSideWinPos[1] And $aCurWinPos[1] <= $aSideWinPos[1] + $aSideWinPos[3] Then
;Left
If Abs(($aSideWinPos[0] + $aSideWinPos[2]) - $nLeft) <= $nRange Then _
DllStructSetData($stWinPos, 3, $aSideWinPos[0] + $aSideWinPos[2])
;Right
If Abs($nLeft + $aCurWinPos[2] - $aSideWinPos[0]) <= $nRange Then _
DllStructSetData($stWinPos, 3, $aSideWinPos[0] - $aCurWinPos[2])
EndIf
If $aCurWinPos[0] + $aCurWinPos[2] >= $aSideWinPos[0] And $aCurWinPos[0] <= $aSideWinPos[0] + $aSideWinPos[2] Then
;Top
If Abs(($aSideWinPos[1] + $aSideWinPos[3]) - $nTop) <= $nRange Then _
DllStructSetData($stWinPos, 4, $aSideWinPos[1] + $aSideWinPos[3])
;Bottom
If Abs($nTop + $aCurWinPos[3] - $aSideWinPos[1]) <= $nRange Then _
DllStructSetData($stWinPos, 4, $aSideWinPos[1] - $aCurWinPos[3])
EndIf
Next
Return 0
EndFunc
;===============================================================================
;
; Function Name: _GetWorkingArea()
; Description: Returns the coordinates of desktop working area rectangle
; Parameter(s): None
; Return Value(s): On Success - Array containing coordinates:
; $a[0] = left
; $a[1] = top
; $a[2] = right
; $a[3] = bottom
; On Failure - 0
;
;BOOL WINAPI SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
;uiAction SPI_GETWORKAREA = 48
;===============================================================================
Func _GetWorkingArea()
Local Const $SPI_GETWORKAREA = 48
Local $stRECT = DllStructCreate("long; long; long; long")
Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", _
"uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
If @error Then Return 0
If $SPIRet[0] = 0 Then Return 0
Local $sLeftArea = DllStructGetData($stRECT, 1)
Local $sTopArea = DllStructGetData($stRECT, 2)
Local $sRightArea = DllStructGetData($stRECT, 3)
Local $sBottomArea = DllStructGetData($stRECT, 4)
Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
Return $aRet
EndFunc
Возможно уже приводил(и) тут нечто подобное, но этот вариант самый лучше из всех предыдущих!
SashaShveik
18-12-2007, 10:45
Добрый день!
Нужно вставить строку из autoit'овского Input'a в EditBox стороннего приложения.
Собственно при выполнении скрипта перемещаю курсор в нужный EditBox и отправляю:
Send(GUICtrlRead($testinput))
При вставке русскоязычные символы вставляются крокозяблами. Как это побороть?
Maza Faka
18-12-2007, 12:39
SashaShveik
Пример:
#include <GuiConstants.au3>
$hGui = GUICreate("Test", 200, 100)
$hInput = GUICtrlCreateInput("", 50, 50, 100, 17)
$Send_Btn = GUICtrlCreateButton("Send", 145, 75, 50, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Send_Btn
Run("notepad.exe")
WinWaitActive("Безымянный")
ControlSetText("Безымянный", "", "Edit1", GUICtrlRead($hInput))
EndSwitch
WEnd
P.S.
Поищи в топике, было много решений этой проблемы.
Вопрос (касается моего примера пристыковки гиу окна) - как можно определить только те окна, которые видно пользователю? BitAND(WinGetState($Title), 2) определяет скрыто ли окно, а как определить не спрятанно ли оно за другими окнами, ведь в моём примере, если окно не скрыто/не свёрнуто, но находится за каким то другим окном, то GUI пристыковывается к краям этого окна, хотя краев не видно.
В идеале хотелось бы конечно опрелделять не просто видимость (a.k.a доступность) окна, а именно его видимые края, чтобы можно было пристыковывать только к тем краям, которые видимы для глаза :).
Проблему вроде решил (http://www.autoitscript.com/forum/index.php?s=&showtopic=52757&view=findpost&p=450377) (осталась только проблема с высокой загрузкой ЦП в момент перетаскивания окна).
[hr]
Функция для корректировки ссылки (вида hттp://, _http://, хттп:// и т.п.):
ConsoleWrite(_CorrectURL('_hттp://creator-lab.ucoz.ru/load/0-0-1-35-20'))
Func _CorrectURL($sURL)
$sURL = StringRegExpReplace($sURL, '(?i)\A[^a-z\d]+|[^a-z\d]+$', "")
Local $sURL_Hold = StringRegExpReplace($sURL, "(?i)(\A.*?(/|\\|:)+[^a-z\d]+|[^a-z\d]+$)", "")
$sURL_Hold = StringReplace(StringReplace($sURL_Hold, " ", "%20"), "\", "/")
If StringLeft($sURL, 4) = "ftp." Then Return "ftp://" & $sURL_Hold
Local $sProtocol = StringRegExpReplace($sURL, "\A.*?(.{1,5}:/).*", "\1/")
If StringLen($sProtocol) <= 5 Then Return "http://" & $sURL_Hold
$sProtocol = StringRegExpReplace($sProtocol, "(?i)\A(h..p|h..р|h.tp|ht..|..tp|.ttp|[а-я]{1,4})://+", "http://", 1)
If @extended > 0 Then Return $sProtocol & $sURL_Hold
$sProtocol = StringRegExpReplace($sProtocol, "(?i)\A(f.p|f.р|f..|.tp|[а-я]{1,3})://+", "ftp://", 1)
If @extended > 0 Then Return $sProtocol & $sURL_Hold
$sProtocol = StringRegExpReplace($sProtocol, "(?i)\A(ms.|.ms|m.s|[а-я]{1,3})://+", "mms://")
If @extended > 0 Then Return $sProtocol & $sURL_Hold
$sProtocol = StringRegExpReplace($sProtocol, "(?i)\A(r.ps|.tps|rt.p|[а-я]{1,4})://+", "rtsp://")
If @extended > 0 Then Return $sProtocol & $sURL_Hold
$sProtocol = StringRegExpReplace($sProtocol, "(?i)\A(h..ps|..tps|.t.ps|[а-я]{1,5})://+", "https://")
If @extended > 0 Then Return $sProtocol & $sURL_Hold
If Not StringRegExp($sProtocol, "(?i)\A(http|https|ftp|mms|rtsp|news|irc)://+") Then $sProtocol = "http://"
Return $sProtocol & $sURL_Hold
EndFunc
По этому поводу вопрос: Встречал ли кто то ссылку, хостинг в которой начинается не с латинской буквы или цифры? а также есть ли ссылки (рабочие) которые завершаются с любым другим символов а не латинской буквой или числом?
[hr]
Поскольку есть "много заинтересованных" в «AutoIt Menu для Opera», я не (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=720#19) забыл напомнить об обновлении плагина (http://creator-lab.ucoz.ru/load/3-1-0-35).
[v1.01 - 20.12.2007]
* Добавлен BBCode Модуль - позволяет использовать BBCode теги в текстовых формах (см. в Readme подробнее).
* Улучшены опции "Run/Open Selected Code".
* Обновлен "AutoUpdateIt" до самой последней версии (1.41).
* Обновлен "Icon_File_Scanner.au3" - теперь разделитель между списками иконок может менять позицию.
* Теперь если AutoIt не найден (при интеграции), даётся возможность выбора, чтобы указать путь к AutoIt директории.
* Теперь можно установить путь к AutoIt (в диалоге настроек) без необходимости закрывать браузер Opera постоянно.
* Теперь при настройке AutoIt Menu, уведомление о закрытии Opera будет показано только при необходимости (таким образом позволяя делать настройки не касающиеся Opera без перезапуска браузера).
* Теперь почти все надоедливые сообщения могут быть отключены (установив соответствующую галочку в появившемся сообщении, или используя диалог настроек).
* Теперь интеграция инструментов (AutoIt Tools) опциональна - вы можете выбирать какой инструмент следует интегрировать - доступно только при интеграции.
* Теперь сообщение, уведомляющее о том что настройка AutoIt Menu прошла успешна, будет показано только если были сделаны изменения касающиеся Opera.
* Исправлена ошибка при интеграции - > файл конфигурации не был создан в назначенной директории (должен создаваться рядом с главным модулем "AutoIt Menu").
* Исправлена ссылка для пункта "Today's Active Topics".
[v1.0 - 13.12.2007]
Первый релиз.
Подскажите как мне отправить письмо на почтовый яшик например мойадрес@mail.ru спомошью функции _INetSmtpMail ,если можно то готовый скрипт с подробным описанием, буду рад помощи
rimm
$s_SmtpServer = "smtp.rambler.ru"
$s_FromName = "User"; омя отправляющего
$s_FromAddress = "1a9s@rambler.ru" от кого шлем(email должен быть правильным, иначе не отправит!!)
$s_ToAddress = "gates@microsoft.com"; кому отправляем
$s_Subject = "TEMA" ;тема письма
$as_Body = ;Текст письма
$s_UserName = "" ;логин для smtp сервера
$s_Password = ""; пароль для smtp сервера
$s_CcAddress = ""
$s_BccAddress = ""
$s_AttachFiles = "" ;путь к файлу для отправки (опционально)
$IPPort=25; порт smtp сервера
$ssl=0
_INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password,$IPPort, $ssl)
Чтобы работала данная функция подключи Mail.au3
Вот на руборде дали мне сылку (http://www.autoitscript.com/forum/index.php?showtopic=41610&st=0&p=309600&#entry309600) вот на этот скрипт
Func _UploadImage($sFilepath)
$oXMLHTTP = ObjCreate("MSXML2.XMLHTTP")
$oXMLDOC = ObjCreate("MSXML.DOMDocument") ; for later reading the XML data from the upload
$oAdoStream = ObjCreate("ADODB.Stream") ; for streaming the image in the post message
$oAdoStream.Mode = 3 ; Set read/write
$oAdoStream.Type = 1 ; Type Binary
$oAdoStream.Open()
$oAdoStream.LoadFromFile($sFilePath)
$oXMLHTTP.Open("POST", 'http://www.imageshack.us/index.php', "false") ; Set http verb to post, url, and asynchronous mode to false
$oXMLHTTP.setRequestHeader("Content-Type", "multipart/form-data;")
;$oXMLHTTP.setRequestHeader("Content-Length", $oAdoStream.Size)
$oXMLHTTP.Send('fileupload="'&$oAdoStream.Read($oAdoStream.Size)&'"&xml="yes"') ; Pretty sure this is how I should stream the data of the image, but am I'm not passing the variables right.
ConsoleWrite("Response Text: "&$oXMLHTTP.responseText)
$sData = $oXMLDoc.load($oXMLHTTP.responseXML.xml)
If Not $sData Then
MsgBox(0, "Error", "Error Loading XML from HTTP")
EndIf
EndFunc
Но у меня это не работает, выдает код страници без ссылки и ошибку Error Loading XML from HTTP
Так и не получается залить картинку
Как в Excel-е узнать есть ли текст в ячеике или нет ? Например в ячейке A1 есть а в A2 нет ?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.