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

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

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

(*.*)


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


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

Профиль | Сайт | Отправить 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

 

Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
замени кусок между If и EndIf:
Спасибо! всё работает как раньше!

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

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

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


Отправлено: 17:00, 31-07-2007 | #221



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

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


Аватара для Creat0R

Must AutoIt


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

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


Как можно послать уведомление в окно GUI, чтобы сработали все функции отзывающиеся на изменение размера окна ($GUI_EVENT_RESIZED и т.п)?

Т.е мне нужно чтобы после появления моего окна GUI, вызвалось что то вроде имитации изменения его размера (как будто бы юзер мышкой изменил размер гуи, и я говорю не про WinMove(), а про изменение с уведомлением (Notifycation)), мне это нужно для того, чтобы все контроли которым присвоено GUICtrlSetResizing(-1, $GUI_DOCKSIZE), поменяли своё положении в соответствии с текущим размером окна (данные о размере берутся с инишки).

Относительные позиции контролов заданы (относительно размерам окна гуи), но это не помагает, когда последний размер окна был довольно большим (данные записываются в инишку), то при уменьшении контроли как бы смещаются внутрь, что не есть гуд... перепробовал всевозможные значения размеров (для GUICtrlSetResizing()), но ничего(?) не подходит .

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

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

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


Отправлено: 04:11, 02-08-2007 | #222


Googler


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

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


Creat0R
можно примерчик?... "на слух" сложно воспринять

ADD: обещанная CallBack-функция для _FileSelectFolder:
Код: Выделить весь код
Func _MyFSFCallbackProc ($hWnd, $iMsg, $wParam, $lParam)
    Local $uCB = DllStructCreate ("char[260];int", $lParam)
    Switch $iMsg
        Case $BFFM_INITIALIZED
            DllCall ("user32.dll","int","SendMessage", _
                "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB))
        Case $BFFM_SELCHANGED
            Local $pIDL=_IDLGetLast($wParam) ; Переход к последнему элементу списка
            ; Условие на допустимые для выбора типы объектов
            If _IDLIsFolder($pIDL) Then
                DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",1)
            Else
                DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",0)
            EndIf
    EndSwitch
EndFunc ;==> _MyFSFCallbackProc

; Рекурсивная функция перехода к последнему объекту списка IDL
Func _IDLGetLast($pIDL)
    Local $u1 = DllStructCreate("ushort", $pIDL)
    Local $u2 = DllStructCreate("ushort", $pIDL + DllStructGetData($u1,1))
    If (DllStructGetData($u1,1) And DllStructGetData($u2,1)) Then Return _IDLGetLast(DllStructGetPtr($u2))
    Return $pIDL
EndFunc
; Возврат типа объекта по его PIDL
Func _IDLGetType($pIDL)
    Local $u = DllStructCreate("ushort;byte", $pIDL)
    Return DllStructGetData($u,2)
EndFunc
; Возврат размера IDL Data
Func _IDLGetSize($pIDL)
    Local $u = DllStructCreate("ushort", $pIDL)
    Return DllStructGetData($u,1)
EndFunc
; Проверка: является ли объект диском
Func _IDLIsDrive($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType=0x23 Or $iType=0x25 Or $iType=0x29 Or $iType=0x2F)
EndFunc
; Проверка: входит ли буква диска в строку
Func _IDLIsDriveIn($pIDL, $sDrv)
    Local $u = DllStructCreate("ushort;byte;char", $pIDL)
    If _IDLIsDrive($pIDL) Then Return $pIDL And StringInStr($sDrv, DllStructGetData($u,3),2)
    Return 0
EndFunc
; Проверка: является ли объектом файл
Func _IDLIsFile($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType = 0x32 Or $iType = 0x34)
EndFunc
; Проверка: является ли объектом каталог
Func _IDLIsFolder($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType = 0x30 Or $iType = 0x31)
EndFunc
; Проверка: является ли объектом компьютер
Func _IDLIsComputer($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And $iType=0x42
EndFunc
; Проверка: является ли объектом сетевой ресурс
Func _IDLIsShare($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And $iType=0xC3
EndFunc
; Проверка: является ли объектом "Рабочий стол"
Func _IDLIsDesktop($pIDL)
    Local $iSize = _IDLGetSize($pIDL)
    Return Not($pIDL And $iSize)
EndFunc
; Проверка: является ли объектом "Мой компьютер"
Func _IDLIsMyComputer($pIDL)
    Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
    Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xE04FD020EA3A6910A2D808002B30309D'
EndFunc
; Проверка: является ли объектом папка "Мои документы"
Func _IDLIsMyDocuments($pIDL)
    Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
    Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xBA8F0D4525ADD01198A80800361B1103'
EndFunc
; Проверка на соответствие регулярному выражению (только для файлов/каталогов)
Func _IDLPathRegExp($pIDL, $sRegExp)
    Local $ret, $res=0, $buf = DllStructCreate("char[260]")
    If $pIDL Then
        $ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pIDL, "ptr", DllStructGetPtr($buf))
        If $ret[0] Then $res = StringRegExp(DllStructGetData($buf,1),$sRegExp)
    EndIf
    Return $res
EndFunc

Последний раз редактировалось amel27, 04-08-2007 в 14:16. Причина: добавление функций

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

Отправлено: 07:42, 02-08-2007 | #223


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
можно примерчик?
Конечно, извеняюсь что сразу не привёл его...

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

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

;Задаём новый размер ГУИ, это будет считано с инишки
$NewWidth = 700
$NewHeight = 400

$WinPosArr = WinGetPos($Gui) ;только для получения X и Y позиции
WinMove($Gui, "", $WinPosArr[0], $WinPosArr[1], $NewWidth, $NewHeight)

; Тут нужно выызвать ту самую имитацию, чтобы все контроли подстроились под новый размер.

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3, $ButtonExit
            Exit
        Case Else

                EndSwitch
WEnd

; Функция для ограничения (минимального) размера окна гуи
Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
    Local $MINGuiX = 508, $MINGuiY = 368
    DllStructSetData($MINMAXINFO, 7, $MINGuiX)
    DllStructSetData($MINMAXINFO, 8, $MINGuiY)
    Return 0
EndFunc
Цитата:
обещанная CallBack-функция для _FileSelectFolder:
Спасибо!

Осталось несколько уточнении

1. Если начальный каталог не имеет слеша на конце (\), то этот каталог не задаётся функцией, а также если начальный каталог является буквой диска, то таких слешей должно быть аж два (C:\\).
Я конечно могу это решить стандартными средствами, поставив это в начало главной функции...

Код: Выделить весь код
If StringLen($sIniDir) <= 3 Then $sIniDir &= "\"
If StringRight($sIniDir, 1) <> "\" Or StringLen($sIniDir) <= 3 Then $sIniDir &= "\"
(Кстати, $sIniDir это опечатка? может $sInitDir? )...

Но просто интересно, почему так происходит?

2. Может функцию диактивирования кнопки “ОК” сделать опционально? т.е чтобы это происходило только при использовании флага $BIF_RETURNONLYFSDIRS? (Сейчас оно в любом случае срабатывает).

3. При выборе обьекта рабочего стола, кнопка “ОК” тоже деактивируется, этот обьект вроде является папкой (т.е рабочий путь)?

4. Когда используется флаг $BIF_BROWSEINCLUDEFILES (для выбора файлов), то их выбрать невозможно - Кнопка “ОК” не активна.

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

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

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


Последний раз редактировалось Creat0R, 03-08-2007 в 02:56.


Отправлено: 00:54, 03-08-2007 | #224


Аватара для Creat0R

Must AutoIt


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

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


С файлами разобрался, добавил ещё одно условие в функцию _MyFSFCallbackProc():

Цитата:
If _IDLIfDrive($iType) Or _IDLIfFolder($iType) Or _IDLIfFile($iType) Then

...

EndIf

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

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

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


Отправлено: 02:54, 03-08-2007 | #225


Googler


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

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


Creat0R

1. $iniDir не причем - это у $BFFM_SETSELECTIONA такие требования... поправил через RegExp
2. Думал, но есть ряд трудностей... во-первых я не нашел аналога для $BIF_BROWSEFORPRINTER, во-вторых, это снизит гибкость CallBack-функции (сейчас можно задать любые условия на объект)
3. Добавил функцию _IDLIsDesktop()
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:46, 03-08-2007 | #226


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
поправил через RegExp
Спасибо! кстати, а можно точно также править в обратную сторону? т.е очистить все символы с левой стороны? (только то что в начале).

Цитата:
есть ряд трудностей.
В принципе это не очень важно, редко когда понадобится возвращать эти элементы... в крайнем случае можно будет изменить ту серию условии

Цитата:
Добавил функцию _IDLIsDesktop()
Спасибо, осталось только сделать функцию типа _IDLIsMyDocuments() - Документы весьма важная папка

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

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

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


Отправлено: 07:35, 03-08-2007 | #227


Googler


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

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


Creat0R
Цитата:
а можно точно также править в обратную сторону? т.е очистить все символы с левой стороны?
конечно можно, какие нужно удалить?
Цитата:
В принципе это не очень важно
в дефолтовую функцию удалось добавить поддержку $BIF_RETURNONLYFSDIRS для любых стилей
Цитата:
осталось только сделать функцию типа _IDLIsMyDocuments()
добавил _IDLIsDriveIn(), _IDLIsMyComputer(), _IDLIsMyDocuments()


З.Ы. cмотрю, ты свою проблему с ресайзом решил?..
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:28, 04-08-2007 | #228


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
какие нужно удалить?
Ну я как бы хотел это использовать в качестве параметра, т.е символ который нужно почистить будет передаваться как параметр в функции.

Ну к примеру символ |.

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

Цитата:
cмотрю, ты свою проблему с ресайзом решил?
Почти, мне на оф. форуме подсказали альтернативу (и довольно простую)...

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

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

GUISetState(@SW_HIDE, $Gui)

$NewWidth = 700
$NewHeight = 500

$WinPosArr = WinGetPos($Gui) ;Just for get the X and Y positions
WinMove($Gui, "", $WinPosArr[0]-(($NewWidth-$Width)/2), $WinPosArr[1]-(($NewHeight-$Height)/2), $NewWidth, $NewHeight)
GUISetState(@SW_SHOW, $Gui)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3, $ButtonExit
            Exit
        Case Else

                EndSwitch
WEnd

Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
    Local $MINGuiX = 508, $MINGuiY = 368
    DllStructSetData($MINMAXINFO, 7, $MINGuiX)
    DllStructSetData($MINMAXINFO, 8, $MINGuiY)
    Return 0
EndFunc
Т.е сначала задать GuiSetState() (в невидимом режиме - @SW_HIDE), и только потом менять размер окна, тогда все контроли в соответствии с новым размером ГУИ меняют и своё положение).

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

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

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


Отправлено: 12:20, 04-08-2007 | #229


Googler


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

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


Creat0R
Цитата:
я как бы хотел это использовать в качестве параметра
Код: Выделить весь код
Func _StripLead($str, $chars)
    ;$chars = StringRegExpReplace($chars, '([][{}()|.?+*\\^])', '\\\1')
    $chars = StringRegExpReplace($chars, '([]\\^])', '\\\1') ; укороченный вариант для классов
    Return StringRegExpReplace($str,'^['& $chars &']+([^'& $chars &'])', '\1')
EndFunc
Цитата:
А как это приминить?
да как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция... для этого ей передается указатель на структуру с флагами... ну, а если флаг не задан то никаких действий не проводится... Единственное ограничение - для "нового стиля" флаг $BIF_RETURNONLYFSDIRS будет подавлять действие штатного флага $BIF_SHAREABLE, поэтому (в текущей редакции) вместе их применять нельзя.

З.Ы. к тексту _MyFSFCallbackProc() добавил функцию _IDLPathRegExp()... может быть полезна при выборе конкретных типов файлов, например "*.EXE", маска передается в формате RegExp()

ADD: зачеркнул - постоянно забываю, что $BIF_SHAREABLE не влияет на "Ок", он меняет тип выводимых объектов в дереве

Последний раз редактировалось amel27, 06-08-2007 в 05:49.

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

Отправлено: 14:13, 04-08-2007 | #230



Компьютерный форум 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




 
Переход