Показать полную графическую версию : [решено] Автоматизация Блокнота и подобных приложении
Как можно ходить, передвигаться по тексту, выделять вырезать слова и копировать?
Например имеем текст в открытом блокнот. Кто пример показать может?
В закрытом тоже интересно, типа изменить текст внутри файла...
И ещё как можно выделять текст в классах Edit (если я правильно называю), особенно длинные и с пробелами, как фокус поймать?
И вставлять/копировать там тексты?
Если есть различные варианты думаю стоит обсудить?
semiono, В справке есть туториал как раз для блокнота, вы его читали?
Вот простой пример:
#include <GuiEdit.au3>
;Запускаем блокнот и ждём его появление
Run(@WindowsDir & "\Notepad.exe")
WinWait("[CLASS:Notepad]")
;Получаем идентификатор окна блокнота
$hNotepad = WinGetHandle("[CLASS:Notepad]")
;Получаем идентификатор Edit-поля в блокноте
$hEdit = ControlGetHandle("[CLASS:Notepad]", "", "Edit1")
;Пишем текст
ControlSetText($hNotepad, "", "Edit1", "Привет Мир!")
Sleep(1000)
;Выделяем слово Мир
_GUICtrlEdit_SetSel($hEdit, 7, 10)
Sleep(1000)
;Копируем его в буфер обмена
$sSelected = ControlCommand($hNotepad, "", "Edit1", "GetSelected")
ClipPut($sSelected)
Ага. Только с компонентами надо разобираться...
$hEdit = ControlGetHandle("[CLASS:AkelPad2]", "", "RichEdit20A1")
я сначала зделал - RichEdit20A но оказалось так надо RichEdit20A1 не сразу ясно бывает
причём для реализации чего либо, надо свой блокнот паковать на всякий случай =)
не сразу ясно бывает »
В AutoIt Info Tool всё ясно:
http://pic.ipicture.ru/uploads/090129/1429/thumbs/PlGVuUIYF2.png (http://ipicture.ru/Gallery/Viewfull/12414572.html)
Наводим на нужный элемент, и копируем данные.
для реализации чего либо, надо свой блокнот паковать на всякий случай
Зачем? :o
Как зачем =)
Я же в примере показал... у меня например, в системе вместо notepad.exe лежит AkelPad и для удобства с таким же именем. Поэтому если бы кто-то зделал какой-то полезный скрипт то классы бы не совпали!
Следовательно надо свои бинари добавлять для распространения дистрибутивов, чтоб всё надёжно работало...
ну хотя бы genuine notepad.exe положить тем более что он не большой. (хотя это просто совет так как он не касается вопросов топика)
у меня например, в системе вместо notepad.exe лежит AkelPad и для удобства с таким же именем »
А у меня Notepad2, и я по прежнему могу работать с обычным блокнотом (см. мой пример выше).
если бы кто-то зделал какой-то полезный скрипт то классы бы не совпали »
Я всё ровно не понимаю зачем паковать в скрипт блокнот, кому нужно тот сам пусть правит под себя. А те кто создают полезные скрипты, не должны подстраиваться под всех.
А у меня Notepad2, и я по прежнему могу работать с обычным блокнотом »
так они же разные:
$hEdit = ControlGetHandle("[CLASS:Notepad]", "", "Edit1")
$hEdit = ControlGetHandle("[CLASS:AkelPad2]", "", "RichEdit20A1")
Возможно Notepad2 и совпадает? Либо он обычно установлен как Program Files и кликается ярлыком?
у меня же %SystemRoot%\system32\notepad.exe - это AkelPad2, так как нет смысла обычный тоже хранить.
Я всё ровно не понимаю зачем паковать в скрипт блокнот »
просто иногда в инсталяторе или ещё в какомнибудь "инструменте" бывает удобно использовать au3...
но я на самом деле прежде всего для себя делаю всё, это лишь так рассуждение.
Есть вопросы!!!
Вот клик по кнопке которая копирует машинный ID в буфер
ControlClick("Product Authorization Wizard","","Button2", "left", 1, 37, 11)
Но как его потом вставить?
ControlSetText(" T-RackS","","Edit2",$var1)
Ведь нельзя же так
$var1 = ControlClick("Product Authorization Wizard","","Button2", "left", 1, 37, 11)
С другой стороны нечто такое тоже нельзя почему-то
$var1 = ? или $var1 = * // как тут неинициализированные данные получить? или что вообще делать!
Вслучае $var1 = ControlGetText было бы проще, однако у нас сразу готов результат кликом по бутону,
но буфер обмена почему-то игнорируется, либо я не знаю как из него вставить!
(хочу заметить, что тут ещё необходимо переключение между окнами, тоесть это окна двух приложений между которыми происходит обмен)
Одним словом надо вставить "буфер обмена" в переменную которая не была объявленна, или же что правильней
неинициализированна? Или что-то другое зделать?
----
А вот это не бывает попроще -
Выделяем слово Мир
_GUICtrlEdit_SetSel($hEdit, 7, 10)
без страшных _GUICtrlEdit_SetSel макросов и хендлов!? Типа просто ControlGetText("title", "text"... и тут указатели?
semiono,
Есть вопросы!
Это уже вроде не на тему блокнота...
у меня же %SystemRoot%\system32\notepad.exe - это AkelPad2
Мой пример вообще проигнорировался? Там же явно указан путь на папку Windows'а, в которой блокнот обычно остаётся оригинальный.
как его потом вставить?
$Var1 = ClipGet()
ControlSetText(" T-RackS","","Edit2", $Var1)
:)
без страшных _GUICtrlEdit_SetSel макросов
Это не макросы а функции, и почему они страшные? Можно так, ещё страшнее (извлёк из той же функции):
;Выделяем слово Мир
DllCall("User32.dll", "int", "SendMessage", "hwnd", $hEdit, "int", 177, "int", 7, "int", 10) ;177 = $EM_SETSEL
$Var1 = ClipGet()
ControlSetText(" T-RackS","","Edit2", $Var1)
Вот это другое дело! Спсибо! Я обыскался по хелпу, но не мог найти сам.
Creat0R, я не знаю что там с блокнотом не понятно, хотя это и не важно настолько.
Твой пример, да не работает, и не должен, потому что у меня именно в папке виндоус другой блокнот.
Я его ещё на стадии установки Windows [t13] подменил AkelPad.exe > i386\NOTEPAD.EX_ чтобы уже никогда не париться с неудобным оригинальным блокнотом. Или надо было оставить как раритет?
Это не макросы а функции, и почему они страшные? »
Да я новичок и меня всё незнакомое пугает сразу :)
меня всё незнакомое пугает сразу »
Придётся привыкать, т.к далеко не всё можно сделать нативными средствами аутоита ;).
(это по выделению текста, поэтому сюда)
Имеем в реестре
a=C:\MyProg\Presets
b=C:\MyProg\file.cab
c=C:\MyProg\file.dat
но не имеем
"C:\MyProg\file.exe"
который надо запустить используя записи в реестре (по которым узнаём его истинное расположение на диске)...
то-есть надо как-то математику врубить?
$getname {"a=C:\MyProg\Presets" - 6 + "file.exe"}
; или $getname {"a=C:\MyProg\file.dat" - 3 + "exe"}
Run($getname)
как это по автоитовски корректно записать?
----------
Делал скрипт, в одном месте нивкакую не работало, как в других примерах такое -
$var1 = ControlGetText("Product Authorization Wizard","","Edit2") что странно!
Врубил смекалку и зделал так -
ControlClick(" T-RackS","","Edit3", "left", 2)
ControlClick(" T-RackS","","Edit3", "right", 1)
Send("{DOWN 3}") ; контекст меню пункт Copy
Send("{ENTER}") ; ....................а нельзя ли было сразу ? - > Send("{DOWN 3}{ENTER}")
Хотя я открывал ресурсы проги и там поле ввода имеет нечто такое | ES_READONLY |
То-есть это серое поле ввода, как бы не активное, но текст оттуда копируется разумеется...
Да, блин иногда гуи ведут себя непредсказуемо... Хорошо я за лефт клик вспомнил =)
Но суть вопроса в том, нормально ли что Edit2 не фокусируется и не захватывается,
если это правда не мои скрипт ошибки возможные? Бывают ли такие трудные GUI ?
как это по автоитовски корректно записать? »
$a = "C:\MyProg\Presets"
$GetName = StringRegExpReplace($a, "\\[^\\]*$", "") & "\file.exe"
ConsoleWrite($GetName & @CRLF)
нормально ли что Edit2 не фокусируется и не захватывается »
Нормально, элемент не имеет жизни и ничего сам по себе не делает ;) То что ему приказали, то и будет делать.
Зарелизилось! Ура!
; для запуска не приложения, а именно его authorization
; (чтоб скрипт исполнился правильно в любом случае) удаляем
RegDelete("HKLM\Software\IK Multimedia\TRackS3","AuthCode")
...
$Path = RegRead("HKLM\Software\IK Multimedia\TRackS3","VPA2Path")
$GetName = StringRegExpReplace($Path, "\\[^\\]*$", "") & "\T-RackS 3.exe"
Run($GetName)
...и далее уже работаем с текстовыми полями :-)
Насколько я понял тут регулярное выражение, но что оно делает - ищет разницу в образцах? Чисто любопытно.
Насколько я понял тут регулярное выражение, но что оно делает »
Да, оно удаляет всё что идёт после последнего слеша (\) включая сам слэш, там кстати вместо замены можно сразу подставить имя файла:
$GetName = StringRegExpReplace($Path, "\\[^\\]*$", "\\T-RackS 3.exe")
а, понял! оставляя путь до слеша слева сносит имя файла! я то гадал, думал символы распознаёт даже )))
да кстати код подкоректирую, спасиб!
off: рег експы изучать тяжело! мне кажется они ещё и вдобавок во всех языках могут различаться?
или нет? В /bin/bash например? или что-то общее у них у всех есть?
как говорил наш уваж. друг Шерлог Холмс, голова как ящик и туда можно положить что угодно ))))
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.