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

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

 

Googler


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

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


HORRIBLE
надеюсь, вы предварительно ознакомились с материалами форума по установке Adobe Reader 8.0?


NikLok
Цитата:
не в курсе почему не открывается этот материал более? »
видимо прикрыли доступ... кидай в PM свое мыло - вышлю в CHM
Цитата:
нет ли [...] желание создать аналог BSPI, который я очень уважаю, но автор его редко дорабатывает»
к сожалению, я не пользуюсь POST-инсталлерами, так как универсальным дистрибам предпочитаю генерить установочные комплекты для каждого конкретного случая.... поэтому для выбора приложений вполне хватает клавиш "Insert" и "F5" FAR-менеджера

Отправлено: 09:48, 02-12-2007 | #801



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

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


Googler


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

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


Creat0R
немного отсебятины по поводу юникода:

- в ANSI-режиме AutoIT юникодовые (UTF-16) строки можно хранить только в переменных типа Binary, так как двухбайтовые символы включают нулевые байты недопустимые в обычных строках…. точнее такие байты воспринимаются как конец ANSI-строки и строковые функции перестают корректно работать. Зато обычные строки (тип String) могут хранить и обрабатывать юникодовый текст в формате UTF-8… но так как Windows API понимает юникод только в UTF-16 перед передачей в API (к примеру в GUI) требуется дополнительное преобразование кодировки.

- чтобы переключить AutoIT в юникодовый режим сам текст скрипта должен быть набран в юникоде… SciTE способен редактировать юникодовые скрипты, но не позволяет пересохранить скрипт в другом формате - для этого можно воспользоваться «блокнотом»

- в юникодовом режиме AutoIT все строки представлены двухбайтовыми символами UTF-16, и все строковые функции «заточены» на работу именно с такими строками, в частности результат StringLen() будет отличаться от количества байтов в строке (в два раза)… для работы с многобайтовыми строками UTF-8 требуется их предварительное преобразование в UTF-16

- при передаче строк в GUI-элементы через SendMessage() важно учитывать в каком режиме находится AutoIT, так как для передачи ANSI и Юникодовых строк используются разные номера сообщений… между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:01, 02-12-2007 | #802


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
может тогда не заморачиваться?
Но где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии?

Цитата:
на самом деле приведенная UDF контролирует POWER-клавиши только для On-Line состояния
On-line это в смысле когда пользователь активен?

Цитата:
между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT
Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt.

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

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

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


Отправлено: 16:22, 02-12-2007 | #803


Пользователь


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

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


На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing().
Конечно можно было бы изменять его размер при получении сообщения WM_SIZING от окна, но к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
Мне кажется, что это происходит из-за отсутствия ID у ListView...
Как быть? Может кто-то уже сталкивался с этим?

P.S.
У UDF'ного ListView нашёл баг: Если попытаться поменять местами пункты в ListView - отображается "+" и окно зависает до тех пор пока не кликнешь по другому окну, например по "Рабочему столу".
Если пункты(item) в ListView имеют изображения, то воспроизводится такой же баг если потянуть за само изображение.

Отправлено: 19:11, 02-12-2007 | #804


Аватара для Creat0R

Must AutoIt


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

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


Diamond,
Цитата:
На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing()
Я бы не стал использовать UDF, чем плоха встроенная функция GuiCtrlCreateListView()?

Цитата:
о к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
А ControlMove() ?

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

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

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

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

Отправлено: 23:31, 02-12-2007 | #805


Googler


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

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


Creat0R
Цитата:
где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии? »
ну да, "проверка наличия" и "проверка актуальности" это немного разные задачи... думаю запрос на обновление должен запрашивать не сам IE, а код загружаемой страницы в зависимости от требований ролика

Цитата:
On-line это в смысле когда пользователь активен? »
нет, это когда комп питается от сети, соответственно "On-Battery" - когда переключается на батарею/UPS... кстати, в панели управления эти режимы также настраиваются раздельно

Цитата:
Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt »
угу ... но между тем этот макрос не задействован ни в одной UDF, хотя имхо он должен использоваться как минимум при определении универсальных констант для сообщений

Отправлено: 04:18, 03-12-2007 | #806


Пользователь


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

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


Creat0R,
Цитата:
Я бы не стал использовать UDF, чем плоха встроенная функция
А в чём преимущество встроенной функции перед _GUICtrlListView_Create(), имхо преимуществ нет.
Что касается недостатков... то есть хоть и один но очень существенный: Если ListView был создан с помощью штатной GuiCtrlCreateListView() то управлять им с помощью UDF'х функций не получится(Хотя некоторые всё же срабатывают).

Цитата:
А ControlMove() ?
Ой, а ведь я совсем забыл про неё...
В общем реализовал так:
Код: Выделить весь код
Func WM_SIZE($HWnd, $MsgID, $wParam, $lParam)
    Switch $HWnd
       Case $hGui
          Local $Client = WinGetClientSize($HWnd)
          ControlMove($HWnd, "", $hListView, 5, 5, $Client[0]-10, $Client[1]-10)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно, а в плане точности этот способ даже лучше чем GUICtrlSetResizing().
Думаю проблема решена, спасибо.

Отправлено: 04:35, 03-12-2007 | #807


Пользователь


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

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


Передача строки другому приложению
Передающее приложение:

Код: Выделить весь код
#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
$Gui = GUICreate("Отправитель",300,100)
$input = GUICtrlCreateInput("Привет!",10,10,280,20)
$button = GUICtrlCreateButton("Отправить",10,40,70,20)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button
			$HWnd = WinGetHandle("Получатель")
			If $HWnd <> "" And Not @error Then 
				SendMsg(GUICtrlRead($input), $HWnd, $Gui)
			Else
				MsgBox(16,"Отправитель","Получатель не обнаружен!")
			EndIf
	EndSwitch
WEnd

;~ $String       - Строка сообщения
;~ $HWnd_Grantee - Приложение получатель  (hwnd)
;~ $HWnd_Sender  - Приложение отправитель (hwnd)
Func SendMsg($String, $HWnd_Grantee, $HWnd_Sender = 0)
	Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
	Local $struct = "char [" & StringLen($String)+1 & "]"
	Local $p = DllStructCreate($tagCopyData)
	Local $StringMSG = DllStructCreate($struct)
	DllStructSetData($p, "dwData", "?") ; ?????
	DllStructSetData($p, "cbData", DllStructGetSize($StringMSG))  ; размер структуры $StringMSG
	DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG))   ; указатель на структуру $StringMSG
	DllStructSetData($StringMSG, 1, $String) ; строка сообщения
	
	DllCall("user32.dll","long","SendMessage","hwnd",$HWnd_Grantee,"int",$WM_COPYDATA,"hwnd",$HWnd_Sender,"ptr",DllStructGetPtr($p))
EndFunc

Принимающее приложение:

Код: Выделить весь код
#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
Global $ArrMessage[2]
$Gui = GUICreate("Получатель",300,100)
$Dummy = GUICtrlCreateDummy()
$Label = GUICtrlCreateLabel("",10,10,280,20)
GUIRegisterMsg($WM_COPYDATA,"WM_COPYDATA")
GUISetState(@SW_SHOW)

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Dummy
			GUICtrlSetData($Label, $ArrMessage[0])
			;MsgBox(0, "Получатель", "Получено сообщение от " & $ArrMessage[1] & @LF & _ 
			;"Текст сообщения: " & $ArrMessage[0])
	EndSwitch
WEnd

Func WM_COPYDATA($HWnd,$MsgID,$wParam,$lParam)
	Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
	Local $p = DllStructCreate($tagCopyData, $lParam)   
	Local $struct = "char [" & DllStructGetData($p, "cbData") & "]" 
	Local $StringMSG = DllStructCreate($struct,  DllStructGetData($p, "lpData"))
	
	$ArrMessage[0] = DllStructGetData($StringMSG,1) ; Строка сообщения
	$ArrMessage[1] = $wParam ; Хэндл окна приложения отправителя
	GUICtrlSendToDummy($Dummy)
EndFunc


И собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData?

P.S.
Как передать-принять командную строку если скрипт которому её нужно передать уже работает? Я в начале предположил что это можно реализовать через WM_COPYDATA используя два процесса. Может есть какой нибудь специальный способ?

Отправлено: 05:38, 03-12-2007 | #808


Аватара для Creat0R

Must AutoIt


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

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


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


Цитата:
этот макрос не задействован ни в одной UDF
Он приминяется в DllCallBack (аж два раза ).

Насколько я знаю, это новый макрос, я его лично приминил пару раз (к примеру в проэкте KeyBoard and Mouse Cleaner - для которго кстати мне и нужны функции блокирования клавиш ) - В ранних версиях аутоита использовался $DTM_SETFORMAT = 0x1005, в последних версиях нужно проверять юникодность, если скрипт в юникоде, тогда значение должно быть $DTM_SETFORMAT = 0x1032 (решение от самого Jon'а ), иначе некорректно отображается формат времени (для GUICtrlCreateDate()) - почему аутоит сам не проверяет, я так и не понял .

Diamond,
Цитата:
А в чём преимущество встроенной функции перед _GUICtrlListView_Create()
Сказать не могу, т.к не использовал никогда второй - но знаю что встроенная функция вполне идеальна для построения практический любого списка (как в плане стильности, так и в плане функциональности).

Цитата:
Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно
Потому что меняется размер GUI
Я бы использовал тут WM_SIZING, оно срабатывает в момент смены размеров.
Кстати если интересно, могу подкинуть функцию для автоматической смены размера колонок в ListView (сам писал), в момент смены размера GUI будут смещаться колонки в идентичный размер для каждой (опционально - либо по ширине списка, либо до последнего разделителя).

Цитата:
Передача строки другому приложению
На оф. форуме этот вопрос решили подобным путём, я же для себя использую такой метод (переделанные функции с того топика):

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

RegisterScriptMsg("SendMessage Test", $CmdLineRaw)

$Gui = GuiCreate("SendMessage Test")
GUISetState()

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

Func Main_Msg_Function($vsMsg)
    MsgBox(0, "", "Recieved message:" & @LF & @LF & $vsMsg)
    Exit
EndFunc

;=====================================
Func RegisterScriptMsg($sTitle, $vMsg)
    Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
    Local $ERROR_ALREADY_EXISTS = 183

    Local $ihWnd = WinGetHandle($sTitle)

    Local $hDll = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
    Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
    If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
        _AU3COM_SendData($vMsg, $ihWnd)
        Exit
    Else
        Local Const $WM_COPYDATA = 0x4A
        GUIRegisterMsg($WM_COPYDATA, "_GUIRegisterMsgProc")
    EndIf
EndFunc

Func _GUIRegisterMsgProc($hWnd, $MsgID, $WParam, $LParam)
    Local Const $WM_COPYDATA = 0x4A
    If $MsgID = $WM_COPYDATA Then
        Local $vsMsg = _AU3COM_RecvData($LParam)
        Local $MSGRECVD = DllStructGetData($vsMsg, 1)
        ;Here is go whatever we need to do with the recieved string ($MSGRECVD)
        Call("Main_Msg_Function", $MSGRECVD)
    EndIf
EndFunc

Func _AU3COM_SendData($InfoToSend, $RecvWinHandle)
    Local Const $WM_COPYDATA = 0x4A
    Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
    Local $CDString = DllStructCreate("char var1[256];char var2[256]") ;the array to hold the string we are sending

    DllStructSetData($CDString, 1, $InfoToSend)
    Local $pCDString = DllStructGetPtr($CDString) ;the pointer to the string
    Local $vs_cds = DllStructCreate($StructDef_COPYDATA);create the message struct
    DllStructSetData($vs_cds, "var1", 0) ;0 here indicates to the receiving program that we are sending a string
    DllStructSetData($vs_cds, "var2", String(StringLen($InfoToSend) + 1));tell the receiver the length of the string
    DllStructSetData($vs_cds, "var3", $pCDString) ;the pointer to the string
    Local $pStruct = DllStructGetPtr($vs_cds)
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $RecvWinHandle, "int", $WM_COPYDATA, "int", 0, "int", $pStruct)

    $vs_cds = 0 ;free the struct
    $CDString = 0 ;free the struct

    Return 1
EndFunc

Func _AU3COM_RecvData($COM_LParam)
    ; $COM_LParam = Poiter to a COPYDATA Struct
    Local $STRUCTDEF_AU3MESSAGE = "char var1[256];int"
    Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
    Local $vs_cds = DllStructCreate($StructDef_COPYDATA, $COM_LParam)
    ; Member No. 3 of COPYDATA Struct (PVOID lpData;) = Pointer to Costum Struct
    Local $vs_msg = DllStructCreate($STRUCTDEF_AU3MESSAGE, DllStructGetData($vs_cds, 3))
    Return $vs_msg
EndFunc


Этот скрипт нужно запустить (не из SciTE), и потом запустить его ещё раз - получим ком. строку с которой запущен скрипт... очень полезно если нужно не запускать повторно копию скрипта, и при этом передать данные (такие как путь к "сбросанному" файлу в файл программы ).

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

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

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-12-2007 в 07:10.

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

Отправлено: 06:38, 03-12-2007 | #809


Googler


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

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


Diamond
Цитата Diamond:
собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData? »
любое число - передается без изменений... можно использовать как "ветвитель" типа Select/Endselect для классификации получаемых структур данных... что-то типа собственной системы сообщений на базе WM_COPYDATA
Цитата Diamond:
Может есть какой нибудь специальный способ? »
тут они все перечислены: http://fort.stup.ac.ru/wmaster/books...708/089727.htm
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:58, 03-12-2007 | #810



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




 
Переход