Показать полную графическую версию : [Архив - Часть 1.3] AutoIt скрипты
Creat0R
VelDmi
Мне трудно представить что кто-то, с затёкшим от напряжения пальцем, упорно удерживает панель заголовка, во время работы приложения. :laugh:
Т.е получается, что это ответственность программиста предусматривать подобные вещи, а не системы...Полностью согласен, но при этом возникает интересный парадокс. :)
Мы требуем от разработчиков исправления бага, но в тоже время забываем что сами являемся в определённой степени разработчиками приложений на AutoIT.
А что нам в свою очередь, мешает исправить этот баг в собственных AutoIT сценариях. Тем более, как уже было сказано amel27 такая возможность есть:
Думаю проблема в AdLib, так как это чисто AutoIT-овский планировщик и он отключается на время передачи управления системному коду (через DLLCall), поэтому ИМХО нужно либо избегать таких вызовов, либо использовать модель GUIRegisterMsg, которая поддерживается самой системой... правда в этом случае прорисовку придется выполнять в основном цикле, а обработку нажатий наоборот в процедуре.
Что... для нас это сложно и не удобно? А уж что говорить о разработчиках AutoIT. Учитывая тот факт что AutoIT бесплатен, сомневаюсь что они захотят что-то глобально поменять.
Получается разработчики AutoIT, свернули вину на разработчиков Windows, а мы в свою очередь свернули вину на разработчиков AutoIT. Но никто из всех трёх (включая и нас), не хочет изменять что-либо в коде. :no:
DiamondНо никто из всех трёх (включая и нас), не хочет изменять что-либо в коде.
Оно, я думаю, не очень то и надо.
Учитывая
Мне трудно представить что кто-то, с затёкшим от напряжения пальцем, упорно удерживает панель заголовка, во время работы приложения.
Diamond
Мне трудно представить что кто-то, с затёкшим от напряжения пальцем, упорно удерживает панель заголовка, во время работы приложения
Тут дело не в этом, просто иногда “скрипт вынужден” использовать внешние ресурсы, и для корректного слежения за работой этих ресурсов (что не маловажно), или даже для вывода информации возвращяемой от этих ресурсов, требуется упорное наблюдение (не упуская из виду как говорится). А когда юзеру вдруг приспичет подвигать то или иное окошко (кстати, я на оф. форуме приводил пример, что если на деактивированном меню нажать мышкой, то также весь скрипт останавливается, и юзеру нет необходимости затёкшими пальцами удерживать что либо :) ), то слежка будет нарушена, что может привести к неправильной работе родительского скрипта (я с этим не раз сталкивался, поэтому и начал эту тему).
Мы требуем от разработчиков исправления бага, но в тоже время забываем что сами являемся в определённой степени разработчиками приложений на AutoIT.
Да, но в отличие от остальных полноценных языков программирования, AutoIt обладает многими ограничениями, я не жалуюсь, этот инструмент для меня стал серъёзным шагом в понимании основ программирования, просто иногда хочется подвигать горизонты :) (что вполне могут сделать разработчики, не прикладывая столько усилии сколько уйдёт у нас, у “простых смертных”).
Что... для нас это сложно и не удобно? А уж что говорить о разработчиках AutoIT.
Ну им наверняка проще...
Получается разработчики AutoIT, свернули вину на разработчиков Windows, а мы в свою очередь свернули вину на разработчиков AutoIT.
Я бы так не сказал, я лично не сворачивал на них вину, просто заметил эту проблему, тем самым намекнул на то что желательно бы это поправить :)
Но никто из всех трёх (включая и нас), не хочет изменять что-либо в коде.
Эх, мне бы знания разработчиков AutoIt, при этом оставить свою амбицию и стремление, и о желании речи никакой не будет, оно есть... ну и чуток времени бы свободного ;)
Creat0RОк, а как это реализовать?только двумя процессами:#include <GUIConstants.au3>
; Ветвление на "генератор" по параметру командной строки: <time> <hwnd> TimeDisp_1
If ""&$CmdLine[$CmdLine[0]]='TimeDisp_1' Then TimeDisp_1 ($CmdLine[2], $CmdLine[1])
; Регистрируем свое событие и функцию
GUIRegisterMsg ($WM_USER+1, "TimeProc_1")
$Time_1 = 100 ; период повторения
; Твой ГУИ (без изменений)
Opt("GuiOnEventMode", 1)
$hWndMain=GUICreate("Test")
GUISetOnEvent(-3, "Quit")
GUICtrlCreateMenu("Test Menu")
GUISetState()
; Запускаем генератор событий
ShellExecute (@AutoItExe, '"'& @ScriptFullPath &'" '& $Time_1 &' '& $hWndMain &' TimeDisp_1')
; Пустой цикл
While 1
Sleep (1000)
Wend
; Код "генератора событий"
Func TimeDisp_1($hWnd, $tWait = 500)
$hWnd = HWnd($hWnd)
While WinExists($hWnd)
Sleep ($tWait)
$ret = DllCall ("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", $WM_USER+1, "int", 0, "ptr", 0 )
Wend
Exit
EndFunc
; Функция обработки события
Func TimeProc_1($hWnd, $Msg, $wParam, $lParam)
ConsoleWrite('*')
EndFunc
; Кусок ГУИ
Func Quit()
Exit
EndFuncв отличие от остальных полноценных языков программирования, AutoIt обладает многими ограничениямивсе-таки это скриптовый язык, а в своей категории он имхо лучший
amel27
А как ты код при вставке цветныс делаешь?
amel27
только двумя процессами:
Хм.. я думал это будет что-то вроде установки задачи для Windows чтобы она собственными средствами “вызывала” подобное сообщение в моём Гуи (т.е без надобности постоянного вызова вторичного скрипта).
Но оно работает, а значит это решаемо проще чем я думал, спасибо большое!
NikLok
А как ты код при вставке цветныс делаешь?
Вопрос не ко мне, но я всё же отвечу...
Я как то тоже поинтересовался (http://forum.oszone.net/showthread.php?p=512798#post511296) этим вопросом, ответ от amel27 (http://forum.oszone.net/showthread.php?p=512798#post511327) ;).
P.S
Кстати, я немного изменил метод (для себя), в принципе нет особой необходимости сохранять в файл результаты, поэтому при первом открытии Гуи галка для ввода исходного кода вручную сразу устанавлвивается, а также есть возможность после вывода результатов одной кнопкой скопировать результат в буфер обмена и закрыть Гуи.
Скоро выложу обновлённую версию.
Creat0Rя думал это будет что-то вроде установки задачи для Windows чтобы она собственными средствами “вызывала” подобное сообщениесобственными средствами можно только "зашедулить" вызов скрипта/программы, т.е. опять же процесса
без надобности постоянного вызова вторичного скриптапо аналогии с CallBack можно сваять простенькую DLL-ку и отправлять сообщения из специального потока в том же процессе... если есть интерес могу попробовать на выходных... кстати, с подачи Piccaso (с оффсайта) Dll-ки собираю теперь на FreeBasic
Скоро выложу обновлённую версиюADD: скрипты выкладывай в форум, интернет-качалками (типа Dounload Master) аттачи нормально берутся
amel27
если есть интерес могу попробовать на выходных
Есть :), спасибо.
крипты выкладывай в форум
Ок.
VelDmi
Ну да, скорее всего так.
У многих приложений наблюдается подобное поведение. Думаю, если это можно назвать "багом", то условно.
Creat0R
Тут дело не в этом, просто иногда “скрипт вынужден” использовать внешние ресурсы, и для корректного слежения за работой этих ресурсовЕсли речь идёт об автоматизации управляющих элементов и окон, то да. Случалось и у меня... С другой стороны, можно использовать BlockInput(), ограничится предупреждением пользователя, либо отказаться от использования GUI, ну и в конце концов запустить другой процесс(скрипт), который выполнит необходимые действия и передаст информацию GUI. Думаю, выход можно найти почти из любой ситуации.
Ну им наверняка проще...Это похоже на сложившийся у многих стереотип, типа: "хорошо там, где нас нет". :)
Я бы так не сказал, я лично не сворачивал на них вину, просто заметил эту проблему, тем самым намекнул на то что желательно бы это поправить :)Ведь я выразился фигурально, а под словом "мы" подразумевал если не всех, то большинство пользователей AutoIT (включая и меня). Все хотят улучшений и расширений возможностей AutoIT, а в случае обнаружения багов сетуют на разработчиков(было бы странно, если бы всё было наоборот). Но ведь если есть возможность обойти проблему другим путём, то почему бы и не попробовать.
Ну и конечно всегда остаётся второй вариант: "дождаться пока проблему решат разработчики", что кстати вполне возможно, ведь AutoIT от версии к версии набирает силу, и надеюсь что появится больше нововведений которые если даже и не исправят, то по крайней мере с большей вероятностью позволят обойти тот или иной баг.
Эх, мне бы знания разработчиков AutoIt, при этом оставить свою амбицию и стремление, и о желании речи никакой не будет, оно есть... ну и чуток времени бы свободногоЛюбое программирование требует времени и усилий, и чем больше затрачено усилий на решение поставленной задачи, тем больше радость от победы, разве нет? При этом вопрос нехватки времени уже сам по себе переходит на второй план, ведь здесь важна самоцель и я верю что у тебя она есть. А знания при таком подходе обязательно придут.
Diamond
можно использовать BlockInput(), ограничится предупреждением пользователя, либо отказаться от использования GUI
Ну это уже крайности, тогда нет смысла что либо говорить о ГУИ, ведь проблема замечена именно с ним ;) - Можно не прибегать к подобным крайностям, и просто деактивировать гуи, но это то самое ограничение, о которм я писал.
выход можно найти почти из любой ситуации.
100% согласен, но думаю в результате важен именно “выход”, и как он будет выполнен :)
если есть возможность обойти проблему другим путём, то почему бы и не попробовать.
От безвыходости именно это мы и делаем, но как оказывается в конце концов, эти “пробы” заканчиваются ещё большими ограничениями и подхрамываниями в работе скрипта чем те о которых я писал.
всегда остаётся второй вариант: "дождаться пока проблему решат разработчики", что кстати вполне возможно, ведь AutoIT от версии к версии набирает силу, и надеюсь что появится больше нововведений которые если даже и не исправят, то по крайней мере с большей вероятностью позволят обойти тот или иной баг.
“Надежда умирает последней” © - Вот поэтому я и пишу баг репорты, потому что знаю что есть шанс на фиксы, кстати, пару моих репортов (1 (http://www.autoitscript.com/forum/index.php?showtopic=45418&hl=file), 2 (http://www.autoitscript.com/forum/index.php?showtopic=42740&hl=file), 3 (http://www.autoitscript.com/forum/index.php?showtopic=40861&hl=file), 4 (http://www.autoitscript.com/forum/index.php?showtopic=45149), 5 (http://www.autoitscript.com/forum/index.php?showtopic=45149)) всё таки пофиксили ;).
чем больше затрачено усилий на решение поставленной задачи, тем больше радость от победы, разве нет?
Конечно да. Просто иногда после “длительных усилии” уже не хватает сил на радости :biggrin:
amel27, NikLok и ВСЕ:
Прикрепил к посту новую версию ГУИ для обработки скрпитов в “цветной вид” (для вставки на форумах).
Теперь в нём все настройки сохраняются, и добавлены многие проверки на ошибочность.
amel27
Чуть не забыл, если пропустить на обработку сам скрипт (иронично получается :) ), то находятся неопознаные стили, я что-то так и не понял, как распознавать и соответственно добавлять неопознанные стили?
Creat0Rчто-то так и не понял, как распознавать и соответственно добавлять неопознанные стилиты разве не понял принцип работы скрипта?.. Если в тексте после всех замен остались XML-теги, то считается что есть неопознанные стили... соответственно, сам себя он не сможет обработать, так как не сможет отличить XML-тег от строки сравнения.
amel27
соответственно, сам себя он не сможет обработать, так как не сможет отличить XML-тег от строки сравнения.
Теперь всё ясно, большое спасибо, парадокс однако получается :)
Creat0R Спасибо!
VadikanМожет этот скрипт прямо к форуму прикурутить. Вставил код и он принулительно разукрасился!?
Creat0Rесли есть интерес могу попробовать на выходных
Есть , спасибокак ни странно получилось, и выглядит многообещающе... :)#include <GUIConstants.au3>
; ГУИ
Opt("GuiOnEventMode", 1)
$hWndMain=GUICreate("Test")
GUISetOnEvent(-3, "Quit")
GUICtrlCreateMenu("Test Menu")
GUISetState()
; Регистрируем сообщение
GUIRegisterMsg($WM_USER+1, "Tick")
; Открываем DLL и возвращаем указатель на функцию
$hDll = DllOpen("ticker.dll")
$hProc = DllCall($hDll,"int","TickerPtr")
; Структура для параметров "генератора сообщений"
$parms = DllStructCreate ("hwnd;int;long;long" )
; Установка требуемых параметров
DllStructSetData ($parms, 1, $hWndMain) ; хэндл главного окна
DllStructSetData ($parms, 2, $WM_USER+1) ; ID сообщения
DllStructSetData ($parms, 3, 300) ; таймаут между сообщениями
DllStructSetData ($parms, 4, 0) ; сколько раз отправить сообщение
; Запускаем поток
$res = DllCall("kernel32.dll","int","CreateThread","int",0,"int",0,"ptr",$hProc[0],"int",DllStructGetPtr($parms),"int",0,"int_ptr",0)
; Пустой цикл
While 1
Sleep (1000)
Wend
; Функция обработки события
Func Tick ($hWnd, $iMsg, $WParam, $LParam)
ConsoleWrite (Number($WParam) & @CRLF)
EndFunc
; Снова ГУИ
Func Quit()
Exit
EndFunc
amel27
как ни странно получилось
Я не сомневался :)
Старая проблема со скачакой атачментов всплыла, файл не скачивается :( - Пробовал DMaster'ом, пробовал через IE качалку, через “Сохранить по ссылке как”, но архив скачивается повреждённый (или вовсе не архив а php файл).
Creat0RСтарая проблема со скачакой атачментов всплыла, файл не скачивается странно, на работе через прокси в IE качает, дома через диалап только DMastrer'ом... так что надежда есть, попробуй FlashGet'ом
линк: http://www.sendspace.com/file/iaq1xh
amel27
Спасибо, работает!
Правда при нажатии на кнопку закрытия/сворачивания и её удерживания (на месте, если удерживая и двигать мышку то нормально), то счётчик останавливается :( - но это не критично, а так работает... я так понял это вызваная Dll'ка посылает постоянно зарегистрированное сообщения в окно ГУИ, и этим самым “провоцируя” запуск нужной функции (зарегистрированной), так?
Хорошо что сама Dll'ка не большая, обычно они бывают большими :)
Creat0Rя так понял это вызваная Dll'ка посылает постоянно зарегистрированное сообщения в окно ГУИ, и этим самым “провоцируя” запуск нужной функции (зарегистрированной), так?угу, самопальный AdLib :) ... имхо в исходнике и без комментов все прозрачно
Хорошо что сама Dll'ка не большая, обычно они бывают большими FreeBasic рулит! ;)
Системные цвета
Const $COLOR_SCROLLBAR = 0 ; - цвет полосы прокрутки
Const $COLOR_BACKGROUND = 1 ; - цвет фона окна
Const $COLOR_ACTIVECAPTION = 2 ; - цвет заголовка активного окна
Const $COLOR_INACTIVECAPTION = 3 ; - цвет заголовка неактивного окна
Const $COLOR_MENU = 4 ; - цвет меню
Const $COLOR_WINDOW = 5 ; - цвет окна
Const $COLOR_WINDOWFRAME = 6 ; - цвет обрамления окна
Const $COLOR_MENUTEXT = 7 ; - цвет текста меню
Const $COLOR_WINDOWTEXT = 8 ; - цвет текста окна
Const $COLOR_CAPTIONTEXT = 9 ; - цвет текста в заголовке окна
Const $COLOR_ACTIVEBORDER = 10 ; - цвет активной границы окна
Const $COLOR_INACTIVEBORDER = 11 ; - цвет неактивной границы окна
Const $COLOR_APPWORKSPACE = 12 ; - цвет рабочего места окна
Const $COLOR_HIGHLIGHT = 13 ; - цвет подсветки
Const $COLOR_HIGHLIGHTTEXT = 14 ; - цвет подсвеченного текста
Const $COLOR_BTNFACE = 15 ; - цвет лицевой части кнопки
Const $COLOR_BTNSHADOW = 16 ; - цвет тени кнопки
Const $COLOR_GRAYTEXT = 17 ; - цвет "серого" текста
Const $COLOR_BTNTEXT = 18 ; - цвет текста в кнопке
Const $COLOR_INACTIVECAPTIONTEXT = 19 ; - цвет текста в заголовке неактивного окна
Const $COLOR_BTNHIGHLIGHT = 20 ; - цвет текущей кнопки
;~ Получаем цвет лицевой части кнопки на текущий момент:
$OldColor = _GetSysColor($COLOR_BTNFACE)
;~ Задаём красный цвет для лицевой части кнопки:
_SetSysColor($COLOR_BTNFACE, 0xFF0000)
;~ тайм-аут 5 секунд
Sleep(5000)
;~ Восстанавливаем полученный ранее цвет
_SetSysColor($COLOR_BTNFACE, $OldColor)
############# -= ФУНКЦИИ =- #############
;~ Позволяет получать системные цвета, определённые текущими параметрами оформления
Func _GetSysColor($nIndex)
$BGRColor = DllCall("user32.dll", "long", "GetSysColor", "long", $nIndex)
$BGR = Hex ($BGRColor[0],6 )
$RGB = "0x" & StringRight($BGR,2) & StringMid($BGR,3,2) & StringLeft($BGR,2)
Return $RGB
EndFunc
;~ Позволяет установить новый цвет для указанного элемента оформления
Func _SetSysColor($nIndex, $nRGBColor)
$RGB = Hex($nRGBColor,6 )
$BGR = "0x" & StringRight($RGB,2) & StringMid($RGB,3,2) & StringLeft($RGB,2)
Local $structColor = DllStructCreate("udword")
Local $structIndex = DllStructCreate("udword")
DllStructSetData($structIndex, 1, $nIndex)
DllStructSetData($structColor, 1, $BGR)
DllCall("user32.dll", "long", "SetSysColors", "long", 1, "ptr", DllStructGetPtr($structIndex), "ptr", DllStructGetPtr($structColor))
EndFunc
Diamond
Спасибо, давно искал что-то подобное :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.