|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты |
|
[архив - Часть 2] AutoIt скрипты
|
(*.*) Сообщения: 36567 |
Внимание! Тема переведена в архивное состояние Текущая тема http://forum.oszone.net/thread-98914.html (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. ![]() Сайт программы Русская справка Коллекция AutoIt скриптов от Sanja Alone Коллекция AutoIt скриптов от MSFN (могут быть устаревшие). Справочник по командам rundll32 (команды запуска диалоговых окон и не только...) AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо). Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров. Цитата Vadikan:
|
||
------- Отправлено: 00:02, 05-02-2006 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
|
|
------- Отправлено: 17:00, 31-07-2007 | #221 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Как можно послать уведомление в окно GUI, чтобы сработали все функции отзывающиеся на изменение размера окна ($GUI_EVENT_RESIZED и т.п)?
Т.е мне нужно чтобы после появления моего окна GUI, вызвалось что то вроде имитации изменения его размера (как будто бы юзер мышкой изменил размер гуи, и я говорю не про WinMove(), а про изменение с уведомлением (Notifycation)), мне это нужно для того, чтобы все контроли которым присвоено GUICtrlSetResizing(-1, $GUI_DOCKSIZE), поменяли своё положении в соответствии с текущим размером окна (данные о размере берутся с инишки). Относительные позиции контролов заданы (относительно размерам окна гуи), но это не помагает, когда последний размер окна был довольно большим (данные записываются в инишку), то при уменьшении контроли как бы смещаются внутрь, что не есть гуд... перепробовал всевозможные значения размеров (для GUICtrlSetResizing()), но ничего(?) не подходит ![]() |
------- Отправлено: 04:11, 02-08-2007 | #222 |
Googler Сообщения: 3665
|
Профиль | Отправить 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить 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 Цитата:
Осталось несколько уточнении ![]() 1. Если начальный каталог не имеет слеша на конце (\), то этот каталог не задаётся функцией, а также если начальный каталог является буквой диска, то таких слешей должно быть аж два (C:\\). Я конечно могу это решить стандартными средствами, поставив это в начало главной функции... If StringLen($sIniDir) <= 3 Then $sIniDir &= "\" If StringRight($sIniDir, 1) <> "\" Or StringLen($sIniDir) <= 3 Then $sIniDir &= "\" ![]() Но просто интересно, почему так происходит? 2. Может функцию диактивирования кнопки “ОК” сделать опционально? т.е чтобы это происходило только при использовании флага $BIF_RETURNONLYFSDIRS? (Сейчас оно в любом случае срабатывает). 3. При выборе обьекта рабочего стола, кнопка “ОК” тоже деактивируется, этот обьект вроде является папкой (т.е рабочий путь)? ![]() |
||
------- Последний раз редактировалось Creat0R, 03-08-2007 в 02:56. Отправлено: 00:54, 03-08-2007 | #224 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать С файлами разобрался, добавил ещё одно условие в функцию _MyFSFCallbackProc():
Цитата:
|
|
------- Отправлено: 02:54, 03-08-2007 | #225 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
1. $iniDir не причем - это у $BFFM_SETSELECTIONA такие требования... поправил через RegExp 2. Думал, но есть ряд трудностей... во-первых я не нашел аналога для $BIF_BROWSEFORPRINTER, во-вторых, это снизит гибкость CallBack-функции (сейчас можно задать любые условия на объект) 3. Добавил функцию _IDLIsDesktop() |
Отправлено: 05:46, 03-08-2007 | #226 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
Цитата:
![]() Цитата:
![]() ![]() |
|||
------- Отправлено: 07:35, 03-08-2007 | #227 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
Цитата:
З.Ы. cмотрю, ты свою проблему с ресайзом решил?.. ![]() |
|||
Отправлено: 10:28, 04-08-2007 | #228 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить 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) 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 |
|||
------- Отправлено: 12:20, 04-08-2007 | #229 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Func _StripLead($str, $chars) ;$chars = StringRegExpReplace($chars, '([][{}()|.?+*\\^])', '\\\1') $chars = StringRegExpReplace($chars, '([]\\^])', '\\\1') ; укороченный вариант для классов Return StringRegExpReplace($str,'^['& $chars &']+([^'& $chars &'])', '\1') EndFunc Цитата:
З.Ы. к тексту _MyFSFCallbackProc() добавил функцию _IDLPathRegExp()... может быть полезна при выборе конкретных типов файлов, например "*.EXE", маска передается в формате RegExp() ADD: зачеркнул - постоянно забываю, что $BIF_SHAREABLE не влияет на "Ок", он меняет тип выводимых объектов в дереве |
||
Последний раз редактировалось amel27, 06-08-2007 в 05:49. Отправлено: 14:13, 04-08-2007 | #230 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|