Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Автоматизация Блокнота и подобных приложении (http://forum.oszone.net/showthread.php?t=130149)

semiono 28-01-2009 13:45 1022268

Автоматизация Блокнота и подобных приложении
 
Как можно ходить, передвигаться по тексту, выделять вырезать слова и копировать?
Например имеем текст в открытом блокнот. Кто пример показать может?
В закрытом тоже интересно, типа изменить текст внутри файла...

И ещё как можно выделять текст в классах Edit (если я правильно называю), особенно длинные и с пробелами, как фокус поймать?
И вставлять/копировать там тексты?
Если есть различные варианты думаю стоит обсудить?

Creat0R 28-01-2009 15:08 1022351

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)


semiono 28-01-2009 22:16 1022853

Ага. Только с компонентами надо разобираться...
$hEdit = ControlGetHandle("[CLASS:AkelPad2]", "", "RichEdit20A1")
я сначала зделал - RichEdit20A но оказалось так надо RichEdit20A1 не сразу ясно бывает
причём для реализации чего либо, надо свой блокнот паковать на всякий случай =)

Creat0R 29-01-2009 00:55 1023022

Цитата:

Цитата semiono
не сразу ясно бывает »

В AutoIt Info Tool всё ясно:



Наводим на нужный элемент, и копируем данные.

Цитата:

для реализации чего либо, надо свой блокнот паковать на всякий случай
Зачем? :o

semiono 29-01-2009 14:11 1023439

Как зачем =)
Я же в примере показал... у меня например, в системе вместо notepad.exe лежит AkelPad и для удобства с таким же именем. Поэтому если бы кто-то зделал какой-то полезный скрипт то классы бы не совпали!
Следовательно надо свои бинари добавлять для распространения дистрибутивов, чтоб всё надёжно работало...
ну хотя бы genuine notepad.exe положить тем более что он не большой. (хотя это просто совет так как он не касается вопросов топика)

Creat0R 29-01-2009 14:19 1023443

Цитата:

Цитата semiono
у меня например, в системе вместо notepad.exe лежит AkelPad и для удобства с таким же именем »

А у меня Notepad2, и я по прежнему могу работать с обычным блокнотом (см. мой пример выше).

Цитата:

Цитата semiono
если бы кто-то зделал какой-то полезный скрипт то классы бы не совпали »

Я всё ровно не понимаю зачем паковать в скрипт блокнот, кому нужно тот сам пусть правит под себя. А те кто создают полезные скрипты, не должны подстраиваться под всех.

semiono 29-01-2009 20:38 1023824

Цитата:

Цитата Creat0R
А у меня Notepad2, и я по прежнему могу работать с обычным блокнотом »

так они же разные:
$hEdit = ControlGetHandle("[CLASS:Notepad]", "", "Edit1")
$hEdit = ControlGetHandle("[CLASS:AkelPad2]", "", "RichEdit20A1")
Возможно Notepad2 и совпадает? Либо он обычно установлен как Program Files и кликается ярлыком?
у меня же %SystemRoot%\system32\notepad.exe - это AkelPad2, так как нет смысла обычный тоже хранить.
Цитата:

Цитата Creat0R
Я всё ровно не понимаю зачем паковать в скрипт блокнот »

просто иногда в инсталяторе или ещё в какомнибудь "инструменте" бывает удобно использовать au3...
но я на самом деле прежде всего для себя делаю всё, это лишь так рассуждение.

semiono 30-01-2009 00:38 1024016

Есть вопросы!!!
Вот клик по кнопке которая копирует машинный 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"... и тут указатели?

Creat0R 30-01-2009 16:39 1024616

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


semiono 30-01-2009 18:03 1024711

$Var1 = ClipGet()
ControlSetText(" T-RackS","","Edit2", $Var1)
Вот это другое дело! Спсибо! Я обыскался по хелпу, но не мог найти сам.

Creat0R, я не знаю что там с блокнотом не понятно, хотя это и не важно настолько.
Твой пример, да не работает, и не должен, потому что у меня именно в папке виндоус другой блокнот.
Я его ещё на стадии установки Windows [t13] подменил AkelPad.exe > i386\NOTEPAD.EX_ чтобы уже никогда не париться с неудобным оригинальным блокнотом. Или надо было оставить как раритет?
Цитата:

Цитата Creat0R
Это не макросы а функции, и почему они страшные? »

Да я новичок и меня всё незнакомое пугает сразу :)

Creat0R 30-01-2009 18:28 1024729

Цитата:

Цитата semiono
меня всё незнакомое пугает сразу »

Придётся привыкать, т.к далеко не всё можно сделать нативными средствами аутоита ;).

semiono 31-01-2009 11:05 1025204

(это по выделению текста, поэтому сюда)
Имеем в реестре
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 ?

Creat0R 31-01-2009 13:26 1025296

Цитата:

Цитата semiono
как это по автоитовски корректно записать? »

Код:

$a = "C:\MyProg\Presets"
$GetName = StringRegExpReplace($a, "\\[^\\]*$", "") & "\file.exe"

ConsoleWrite($GetName & @CRLF)

Цитата:

Цитата semiono
нормально ли что Edit2 не фокусируется и не захватывается »

Нормально, элемент не имеет жизни и ничего сам по себе не делает ;) То что ему приказали, то и будет делать.

semiono 01-02-2009 01:11 1025873

Зарелизилось! Ура!
Код:

; для запуска не приложения, а именно его 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)
...и далее уже работаем с текстовыми полями :-)

Насколько я понял тут регулярное выражение, но что оно делает - ищет разницу в образцах? Чисто любопытно.

Creat0R 01-02-2009 01:21 1025876

Цитата:

Цитата semiono
Насколько я понял тут регулярное выражение, но что оно делает »

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

Код:

$GetName = StringRegExpReplace($Path, "\\[^\\]*$", "\\T-RackS 3.exe")

semiono 01-02-2009 01:26 1025878

а, понял! оставляя путь до слеша слева сносит имя файла! я то гадал, думал символы распознаёт даже )))
да кстати код подкоректирую, спасиб!
off: рег експы изучать тяжело! мне кажется они ещё и вдобавок во всех языках могут различаться?
или нет? В /bin/bash например? или что-то общее у них у всех есть?
как говорил наш уваж. друг Шерлог Холмс, голова как ящик и туда можно положить что угодно ))))


Время: 07:26.

Время: 07:26.
© OSzone.net 2001-