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

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

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

(*.*)


Сообщения: 36549
Благодарности: 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:
А подробнее можно плиз?
как раз тот случай, когда для нахождения нового символа вместо перебора всех элементов массива и попарного сравнения можно в качестве индекса просто указать старый символ и сразу получить результат. Хотя кода для инициализации массива Scripting.Dictionary потребуется больше, зато сама перекодировка символа будет проходить одной командой.
Цитата Creat0R:
нужно получить текст с начала строки
если навскидку - выделение всей строки и возврат текста текущего контрола:
Код: Выделить весь код
Send("{HOME}+{END}")
Код: Выделить весь код
$sText = ControlGetText ("", "", ControlGetFocus (""))
Цитата Creat0R:
с длинными кусками текста немного замедлено выделение, но это всё что я пока могу придумать
да уж, мне тоже ничего лучше в голову пока не приходит, надо подумать

Последний раз редактировалось amel27, 03-10-2007 в 10:47.


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



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

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


Аватара для Creat0R

Must AutoIt


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

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


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

Цитата:
$sText = ControlGetText ("", "", ControlGetFocus (""))
Это первое что я попробовал Спасибо. Там не стандартные элементы, и стандартными средставми AutoIt получить текст (или делать другие опирации), не реально.

Цитата:
надо подумать
Мне кажется тут нужно как то по RegExp получить нужное число “прыжков” влево (в соответствии с “законами выделения” по Ctrl Shit Left). Я пробовал, но всё что у меня получилось это разделить исходный текст на запятые, пробелы, и подобные символы.. но нужен более продвинуты Pattern, где будут учитываться идущие подряд разделители, разновидность разделителей идущих подряд , и т.п.

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

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

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


Отправлено: 13:30, 03-10-2007 | #542


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


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

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


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

Отправлено: 00:58, 04-10-2007 | #543


Googler


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

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


samsobi
Цитата:
Как мне найти ее истинные координаты и щелкнуть правой кнопкой мыши?
ТУТ Creat0R давал линк на библиотеку функций для работы с треем (о нем речь?). Среди них есть _SysTrayIconPos() и _SysTrayIconIndex(), с помощью которых можно найти индекс иконки и определить ее координаты на рабочем столе, останется только" сделать клик".


Creat0R,
Цитата:
Там не стандартные элементы, и стандартными средставми AutoIt получить текст (или делать другие опирации), не реально
чем же он нестандартен?.. как я это себе представляю: 1) нужно найти HWND активного контрола, 2) пытаться "поговорить" с ним при помощи SendMessage(). Вот тестовый вариант для определения длины текста текущего контрола, попробуй для своего:
Код: Выделить весь код
HotKeySet("^`", "TEST")
While 1
    Sleep(500)
WEnd

Func TEST()
    ConsoleWrite (_ControlGetTextLength()&@CRLF)
EndFunc

Func _ControlGetTextLength()
    Local $u = DllStructCreate("int;int;hwnd;hwnd;hwnd;hwnd;hwnd;hwnd;long;long;long;long")
    DllStructSetData ($u, 1, DllStructGetSize($u))

    Local $TopWnd = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
    Local $TID = DllCall('user32.dll', 'int', 'GetWindowThreadProcessId', 'hwnd', $TopWnd[0], 'ptr', 0)
    DllCall('user32.dll', 'int', 'GetGUIThreadInfo', 'int', $TID[0], 'ptr', DllStructGetPtr($u))
    Local $Res = DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', DllStructGetData($u,8), 'int', 0xE, 'int', 0, 'ptr', 0)
    Return $Res[0]
EndFunc
Цитата Creat0R:
Мне кажется тут нужно как то по RegExp получить нужное число “прыжков
для этого мало знать выделенный фрагмент - нужен вест текст... к тому же нет гарантий, что разные окна будут обрабатывать клавиши одинаково... к примеру Ctrl+A в IE у меня не сработал

Цитата Creat0R:
А подробнее можно плиз? »
Вот что получилось (на базе твоего, но без сохранения выделения):
Код: Выделить весь код
Global $objASC = ObjCreate("Scripting.Dictionary")
Global $objANS = ObjCreate("Scripting.Dictionary")

InitMatrix ($objASC, $objANS)
HotKeySet("^`", "ConvertProc")
While 1
    Sleep(500)
WEnd

Func ConvertProc()
    Send("^{Insert}")
    Local $strSelect = ClipGet()
    If $strSelect='' Then Return
    ClipPut(InvertText($strSelect, $objASC, $objANS))
    Sleep(100)
    Send("+{Insert}")
    ClipPut('')
EndFunc

Func InvertText($sText, ByRef $objASC, ByRef $objANS)
    If StringIsASCII($sText) Then
        Return ConvertText($sText, $objASC)
    Else
        Return ConvertText($sText, $objANS)
    EndIf
EndFunc

Func ConvertText($sText, ByRef $objMatrix)
    Local $i, $s, $n, $sRes=''
    For $i=1 To StringLen($sText)
        $s = StringMid($sText,$i,1)
        $n = $objMatrix.Item ($s)
        If $n Then
            $sRes &= $n
        Else
            $sRes &= $s
        EndIf
    Next
    Return $sRes
EndFunc

Func InitMatrix(ByRef $objASC, ByRef $objANS)
    Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
    Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
    For $i=1 To StringLen($aASC)
        $objASC.Add (StringMid($aASC,$i,1),StringMid($aANS,$i,1))
        $objANS.Add (StringMid($aANS,$i,1),StringMid($aASC,$i,1))
    Next
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:33, 04-10-2007 | #544


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
Вот тестовый вариант для определения длины текста текущего контрола, попробуй для своего:
Попробовал, всегда возвращает 0 (текст ест-но набран).

Цитата:
нужен вест текст
Ctrl Shift Home

Цитата:
нет гарантий, что разные окна будут обрабатывать клавиши одинаково
Ну хотябы для тех которые обрабатывают стандартные клавиши (виндовские).

Цитата:
Вот что получилось
Класно получилось, спасибо, попробую это использовать в моё скрипте...
Я кстати ещё хотел бы сделать небольшой GUI-интерфейс для этого скрипта, чтобы “на лету” можно было править соотношения символов (т.е сопостовлять к одной клавише другую, у меня иногда не очень удобно получается, нужно руками править некоторые символы). Это поможет использовать не только Rus <-> Eng

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

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

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


Отправлено: 18:21, 04-10-2007 | #545


Googler


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

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


Creat0R
Цитата:
Попробовал, всегда возвращает 0
HWND возвращается корректно, хотя стандартные сообщения действительно не воспринимает... причем все тулзы класса WinInfo вообще не распознают текст окна... на всякий случай может кому пригодится - функция для возврата HWND окна/контрола текущего ввода:
Код: Выделить весь код
Func _ControlGetFocus()
    Local $res, $u = DllStructCreate("int;int;hwnd;hwnd;hwnd;hwnd;hwnd;hwnd;long;long;long;long")
    DllStructSetData ($u, 1, DllStructGetSize($u))

    $res = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
    $res = DllCall('user32.dll', 'int', 'GetWindowThreadProcessId', 'hwnd', $res[0], 'ptr', 0)
    DllCall('user32.dll', 'int', 'GetGUIThreadInfo', 'int', $res[0], 'ptr', DllStructGetPtr($u))
    Return DllStructGetData($u, 4)
EndFunc
Цитата:
Ctrl Shift Home
нет, при этом потеряется текущая позиция курсора... для полного обсчета требуется: полный текст, выделенный текст, текущая позиция курсора - положение выделенного фрагмента по отношению ко всему тексту... т.е. одними клавишами тут ИМХО не обойтись - нужны альтернативные способы получения инфы... но тогда потеряется универсальность (твой пример с OperaWindowClass).
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:51, 05-10-2007 | #546


Аватара для Creat0R

Must AutoIt


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

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


amel27,
Цитата:
стандартные сообщения действительно не воспринимает
Может есть другие методы получения текста? вот интересно, как Punto Switcher распознаёт текст в любом месте?

Цитата:
тогда потеряется универсальность
Ну хотябы для стандартнных полей, не страшно если в строке адреса выделяться не будет, в крайнем случае там можно будет использовать текущий метод (Send(+{Left " & StringLen($ClipText) & "}")).

Но вообще то, вот как я имел в виду:

Откроем Notepad, и впишем туда это:

Цитата:
this is a test() and ; only test ;
Теперь поставим курсор в конец этого текста, зажмём Ctrl + Shift, и поодиночно будем нажимать клавишу влево - нам понадобится нажать 10 раз клавишу влево чтобы весь наш (нужный) текст был выделен.

Вот я и подумал, если мы заранее знаем наш текст (который изначально был выделен и конвертирован - но нам нужен уже “новый”, конвертированный текст), то всё что нам нужно сделать, так это распознать сколько раз в этом тексте, встречаются символы по которым Ctrl Shift Left будет переходить - т.е как я это вижу, нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево (в нашем случае должно получится 10) по @Extended, ну или через размерность массива если использовать только StringRegExp().

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

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

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:56, 05-10-2007 | #547


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

Ветеран


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

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


При копировании с использованием
Код: Выделить весь код
ObjCreate("shell.application")
, возвращаемое значение отсутствует, соответственно возникает вопрос, как отследить скопировался ли файл или во время процесса копирования пользователь отменил копирование и исходя из результата выдать итоговое сообщение. Пока проверяю сравнивая размер исходного и конечного файла, но может есть более красивое и практичное решение?
Код: Выделить весь код
$copy = CopyFile("d:\Video\Films", "C:\", "video.avi")
If @error Then
    MsgBox(16, "Error", "Copying is canceled")
Else
    MsgBox(0, "Done", "Copying successful")
EndIf

Func CopyFile($source, $dest, $file)
    $WinShell = ObjCreate("shell.application")
    $WinSHell.NameSpace($dest).CopyHere($source &"\"& $file)
    If FileGetSize($source &"\"& $file) = FileGetSize($dest & $file) Then
        Return 0
    Else
        Return SetError(1)
    EndIf
EndFunc

Отправлено: 09:19, 05-10-2007 | #548


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


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

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


Вопрос по GUIRegisterMsg($WM_NCPAINT), как я понял если $wParam возвращает 1, значит произошла перерисовка всего окна.
Во всех остальных случаях можно ли как-то узнать координаты перерисовки?

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


Аватара для Creat0R

Must AutoIt


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

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


amel27
Цитата Creat0R:
нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево »
Вот оно! Сделал (после 3-ёх часов экспериментирования ):

Код: Выделить весь код
Func GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc
Возможно это сделать и более короче, но я умею только так, а глвавное - оно работает!
Есть конечно пару(?) недостатков - к примеру, если выделить текст посредине общего текста, то выделяться будут и все предыдущие символы, идущие подряд до первого символа в выделенном тексте.

Вот полное применение + использование твоего примера:

Код: Выделить весь код
#NoTrayIcon

Global $objASC = ObjCreate('Scripting.Dictionary')
Global $objANS = ObjCreate('Scripting.Dictionary')
InitMatrix($objASC, $objANS)

HotKeySet('`', 'ConvertProc')
HotKeySet('^q', 'Quit')

While 1
    Sleep(100)
WEnd

Func ConvertProc()
    Local $OldClip = ClipGet()
    ClipPut('')
    Send('^{Insert}')
    Local $SelectedText = ClipGet()
    If $SelectedText = '' Then Return
    Local $InvertedText = InvertText($SelectedText, $objASC, $objANS)

    ClipPut($InvertedText)
    Sleep(100)
    Send('+{Insert}')

    Local $LeftJumps = GetLeftJumps($InvertedText)
    Send('^+{LEFT ' & $LeftJumps & '}')

    Send('{CTRLDOWN}')
    Send('{CTRLUP}')

    ClipPut($OldClip)
EndFunc

Func InvertText($sText, ByRef $objASC, ByRef $objANS)
    If StringIsASCII($sText) Then
        Return ConvertText($sText, $objASC)
    Else
        Return ConvertText($sText, $objANS)
    EndIf
EndFunc

Func GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc

Func ConvertText($sText, ByRef $objMatrix)
    Local $i, $s, $n, $sRes = ''
    For $i = 1 To StringLen($sText)
        $s = StringMid($sText, $i, 1)
        $n = $objMatrix.Item ($s)
        If $n Then
            $sRes &= $n
        Else
            $sRes &= $s
        EndIf
    Next
    Return $sRes
EndFunc

Func InitMatrix(ByRef $objASC, ByRef $objANS)
    Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
    Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
    For $i = 1 To StringLen($aASC)
        $objASC.Add (StringMid($aASC, $i, 1), StringMid($aANS, $i, 1))
        $objANS.Add (StringMid($aANS, $i, 1), StringMid($aASC, $i, 1))
    Next
EndFunc

Func Quit()
    Exit
EndFunc
Главную клавишу конвертирования пришлось изменить, Ctrl ` вызывало проблемы - пока оставил только `.

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

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

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


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



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




 
Переход