Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Закрытая тема
Настройки темы
[архив - Часть 2] AutoIt скрипты

(*.*)


Сообщения: 36548
Благодарности: 6692


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 27-01-2008
Внимание!
Тема переведена в архивное состояние







(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:02, 05-02-2006

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
чтобы отображалась граница растягиваемого окна (только граница, без содержимого окна) »
ИМХО от WM_SETREDRAW толку мало - оно не отличается от @SW_LOCK, тебе же нужна рамка... Может для установки размера использовать специальное полупрозрачное окно?
Цитата:
чтобы не сфокусированный элемент возвращала, а тот над которым проводим мышкой? (типа _ControlGetHovered()) »
попробуй так:
Код: Выделить весь код
Func _ControlGetHovered()
    Local $ret = DllCall("user32.dll", "int", "WindowFromPoint", _
        "long", MouseGetPos(0), _
        "long", MouseGetPos(1) )
    Return $ret[0]
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:46, 15-10-2007 | #601



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


Oldschool
Цитата:
я хочу прочитать эту линию
Ну так и считывай её:
Код: Выделить весь код
$text = ControlListView("Drop_Gui", "", "SysListView321", "GetText", 10) ;число 10 означает индекс элемента, счёт идёт с нуля
MsgBox(0, "GetList", $text)

-------
Сообщение помогло? Не забудьте нажать на Полезное сообщение


Отправлено: 11:16, 15-10-2007 | #602


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Цитата:
ИМХО от WM_SETREDRAW толку мало - оно не отличается от @SW_LOCK
То же самое мне на оф. форуме сказали
Цитата:
Может для установки размера использовать специальное полупрозрачное окно?
На своё же удивление, я написал функцию для отката состояния “Отображать содержимое окна при перетаскивании”, это всего лишь для демонстрации того, что именно мне требуется сделать (видимо мой Английский ещё сыроват, ну или до кое кого медленно доходит )...

И вот на основе этого примера (полагаю), мне подкинули идею (а точнее готовый пример с решением), ведь на момент растягивания/смещения окна, можно отключать режим “Отображать содержимое окна при перетаскивании”, а потом восстанавливать старое состояние (как я только сам до этого не додумался)...

Код: Выделить весь код
#include <GUIConstants.au3>

Global Const $WM_EXITSIZEMOVE = 0x232
Global Const $WM_SYSCOMMAND = 0x0112
Global Const $SC_MOVE = 0xF010
Global Const $SC_SIZE = 0xF000

Global $Old_Param

$Gui = GUICreate("GUI", 200, 400, -1, -1, $WS_SIZEBOX)
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

$Button = GUICtrlCreateButton("Button", 50, 100, 100, 21)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFF0)
        Case $SC_MOVE, $SC_SIZE
            ;Local Const $SPI_SETDRAGFULLWINDOWS = 37
            ;Local Const $SPI_GETDRAGFULLWINDOWS = 38
            ;Local Const $SPIF_SENDWININICHANGE = 2
            Local $tBool = DllStructCreate("int")
            DllCall("user32.dll", "int", "SystemParametersInfo", "int", 38, "int", 0, "ptr", DllStructGetPtr($tBool), "int", 0)
            $Old_Param = DllStructGetData($tBool, 1)
            DllCall("user32.dll", "int", "SystemParametersInfo", "int", 37, "int", 0, "ptr", 0, "int", 2)
    EndSwitch
EndFunc

Func WM_EXITSIZEMOVE()
    DllCall("user32.dll", "int", "SystemParametersInfo", "int", 37, "int", $Old_Param, "ptr", 0, "int", 2)
EndFunc
Цитата:
попробуй так:
То что нужно! Спасибо!
Я так понял тут возвращается идентификатор контроля? мне просто нужно сравнивать с элементами моего ГУИ, а там как известно обычная нумерация элементов, я конечно использовал GuiCtrlGetHandle, а на возвращённое значение от функции _ControlGetHovered() использовал Hwnd, но вот хотелось бы узнать, возможно ли конвертировать этот самый идентификатор в то же число, как и возвращает элемент GUI? (чтобы можно было просто использовать стандартные функци для чтения данных от GUI, типа GuiCtrlRead()).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:26, 15-10-2007 | #603


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет. У меня такая задача. Нужно в одной папке просмотреть все вложенные подпапки (количество подкаталогов, количество уровней вложенности и иена подкаталогов заранее неизвестны). Как с помощью AutoIT получить список подкаталогов данного каталога?

Отправлено: 23:15, 15-10-2007 | #604


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


-AAA-,
Цитата:
Как с помощью AutoIT получить список подкаталогов данного каталога?
Ранее приводилась функция (_DirListToArray() - в самом конце).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 00:01, 16-10-2007 | #605


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
возможно ли конвертировать этот самый идентификатор в то же число, как и возвращает элемент GUI? »
Код: Выделить весь код
Func _ControlIDGetHovered()
    Local $ret = DllCall("user32.dll", "int", "WindowFromPoint", _
        "long", MouseGetPos(0), _
        "long", MouseGetPos(1) )
    $ret = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $ret[0])
    Return $ret[0]
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:39, 16-10-2007 | #606


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


Интересная штука WinAPI
Поначалу абсолютно не понимал, что к чему, но благодаря amel27, вроде начал понимать.
Примеры того, что смог сделать сам:

Создание файла (текстового):
Код: Выделить весь код
Global Const $lCreate_RW = 0x00000000

Func FileCreate()
    DllCall("kernel32.dll", "int", "_lcreat", "str", @ScriptDir & "\test.txt", "int", $lCreate_RW)
    If Not @error Then MsgBox(64, "Success", "File test.txt created in " & @ScriptDir)
EndFunc
Активирование окон:
Код: Выделить весь код
#include <GUIConstants.au3>

$gui = GuiCreate("Test", 200, 100)
$button = GUICtrlCreateButton("Child", 10, 70, 50, 25)
$child = GUICreate("Dummy", 300, 200)
$ChildButton = GUICtrlCreateButton("Parent", 10, 70, 50, 25)

GUISetState(@SW_HIDE, $child)
GUISetState(@SW_SHOW, $gui)

While 1
    $msg = GUIGetMsg(1)

        Select
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $gui
        ExitLoop
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $child
        GUISetState(@SW_HIDE, $child)
    Case $msg[0] = $button
        If Not GetWinState() Then
            GUISetState(@SW_SHOW, $child)
        Else
            SetActive($child)
        EndIf
    Case $msg[0] = $ChildButton
        SetActive($gui)
    EndSelect
WEnd

Func SetActive($hwnd)
    DllCall("user32.dll", "hwnd", "SetActiveWindow", "hwnd", $hwnd)
EndFunc

Func GetWinState()
    Return BitAND(WinGetState($child), 2)
EndFunc

Отправлено: 12:15, 16-10-2007 | #607


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


-AAA-
Цитата:
Нужно в одной папке просмотреть все вложенные подпапки
Можно так:

Код: Выделить весь код
#include <File.au3>
#include <Array.au3>

Global $DirArray[1]
Dim $sPath = "c:\windows"

$GetDirs = DirList($sPath)
_ArrayDisplay($DirArray)

Func DirList($path)
    Local $sRet = ""
    Local $sDir = _FileListToArray($path, "*", 2)

        If IsArray($sDir) And $sDir[0] > 0 Then
        For $i = 1 To UBound($sDir) - 1
            _ArrayAdd($DirArray, $sDir[$i])
            $sRet = DirList($sPath &"\"& $sDir[$i])
        Next
    EndIf
EndFunc

Отправлено: 16:05, 16-10-2007 | #608


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Maza Faka:
Можно так: »
идея понятна, но ты очевидно поторопился , итак:

- у тебя очепятка ($path vs $sPath);
- имя каталога заносится в массив без пути;
- проверка локального массива через IsArray() необязательна (особенность For);
- проверка глобального массива IsArray() желательна (особенность _ArrayAdd())
- зачем $sRet ?
- наконец, повторюсь: чтобы избежать путаницы при повторном использовании функций с глобальными переменными их нужно объявлять в параметрах через ByRef.
Код: Выделить весь код
#include <File.au3>
#include <Array.au3>

Global $DirArray[1]
_ArrayDirListAdd($DirArray, "c:\windows")
_ArrayDisplay($DirArray,'')

Func _ArrayDirListAdd (ByRef $aGDir, $sPath = @ScriptDir)
    Local $aLDir = _FileListToArray($sPath, "*", 2)
    For $i = 1 To UBound($aLDir) - 1
        If IsArray($aGDir) Then _ArrayAdd($aGDir, $sPath &"\"& $aLDir[$i])
        _ArrayDirListAdd ($aGDir, $sPath &"\"& $aLDir[$i])
    Next
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:12, 17-10-2007 | #609


Аватара для Maza Faka

Ветеран


Сообщения: 604
Благодарности: 133

Профиль | Отправить PM | Цитировать


amel27
Цитата:
- у тебя очепятка ($path vs $sPath);
Вообще-то сделано специально, теперь вижу, что без смысла.

Цитата:
- имя каталога заносится в массив без пути;
Поторопился

Цитата:
- проверка локального массива через IsArray() необязательна (особенность For);
Учту на будущее.

Цитата:
- проверка глобального массива IsArray() желательна (особенность _ArrayAdd())
А зачем постоянно проверять массив $aGDir ведь он уже обьявлен массивом?

Цитата:
- зачем $sRet ?
Помнишь пример который ты постил для меня:
Код: Выделить весь код
MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir))

Func _FindFile($sFile, $sPath)
    Local $sRetPath='', $sFullPath
    Local $hSearch = FileFindFirstFile($sPath & "\*.*"), $sName = FileFindNextFile($hSearch)
    While @error=0 And $sRetPath = ''
        $sFullPath = $sPath &'\'& $sName
        If $sName = $sFile Then $sRetPath = $sPath
        If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath)
        $sName = FileFindNextFile($hSearch)
    WEnd
    FileClose($hSearch)
    Return $sRetPath
EndFunc
Цитата:
Теперь к вопросу о возвращаемом значении… Во-первых, функция не является рекурсивной, так как нарушено одно из правил рекурсии: возвращаемое функцией значение должно передаваться по всей цепочке рекурсивных вызовов, у тебя же значение, возвращаемое WritePathToReg() вообще игнорируется… из этого имеем два следствия:
- дальше первого уровня подкаталогов функция и не пытается заглянуть, если бы файл лежал глубже чем на один уровень функция бы его не нашла;
- функция, осуществившая рекурсивный вызов не знает о результате этого вызова… поэтому даже если файл найден (как в твоем случае) на возвращаемое значение это никак не повлияет и результат будет зависеть только от содержимого текущего каталога ($path).

один из возможных вариантов,
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath
Цитата:
- наконец, повторюсь: чтобы избежать путаницы при повторном использовании функций с глобальными переменными их нужно объявлять в параметрах через ByRef.
А зачем постоянно передавать глобальный массив по ссылке?

Отправлено: 14:06, 17-10-2007 | #610



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход