Что нового

Захват текста из окна ,его редактирование (выбор нужной части текста)

pacazan

Новичок
Сообщения
3
Репутация
0
В процессе автоматизации установки Battlefield 2 + 100500 модов сел на мель....
Необходимо извлечь лицензионный код из keygen.exe и вставить в окно регистрации ключа в игре.
Но при захвате текста из окна keygen.exe(использовал WinGetText и последующую запись его в переменную) копируются лишние символы и слова "-" , "&Exit, Battlefield 2 keygen" :stars:
Проблему лишних слов можно решить перейдя в облать Edit c последующим копирование но это не решает как избавиться от '-'...
Подскажите нубу какие есть варианты решения проблемы :beer:
Вот код:
Код:
;отработка кейген
#include "keygen.au3"
Run(@ProgramFilesDir & 'BattleField.2.VBIOS\keygen.exe')
WinWaitActive( "Vitality :: Battlefield 2 keygen", "Battlefield 2 keygen")
$kod = WinGetText("Vitality :: Battlefield 2 keygen", "")
WinClose("Vitality :: Battlefield 2 keygen", "Battlefield 2 keygen")
WinActivate( "Battlefield 2", "Введите код, напечатанный на белой наклейке внутри упаковки с игрой или на обложке Руководства пользователя.")
Send($kod)


Вот окно откуда копируется лицензионный код:

Вот окно куда он собственно и требуеться:

Вот сам keygen:
 

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Дай данные о названии заголовка окна(Title:smile: со скриншота, и данные о полях а именно:

Advanced (Class): ...

Через Autoit Window info. Расположи из по очереди как идут, в столбик. Тогда покажу довольно простой способ копирования кода.
 

chymax3m

Новичок
Сообщения
26
Репутация
1
Могу подсказать только в общих чертах (так как сам не очен силен в этом :stars:smile:: нужно перебрать значение Вашей переменной
Код:
$kod
с помощью функции
Код:
StringRegExp ( "test", "pattern" [, flag ] [, offset ] ] )
по каком-то шаблону и заменить "-" на "" при помощи
Код:
StringReplace ( "string", "searchstring" или start, "replacestring" [, count [, casesense]] )
, результат присвоить новой переменной которая и будет отправлятся в окно с игрой...
P. S. По-моему функции
Код:
ControlGetText ( "title", "text", controlID)
и
Код:
ControlSend ( "title", "text", controlID, "string" [, flag] )
более надежные для считывания и отправки текста в элемент control.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Попробуй так:
Код:
#include "keygen.au3"
Run(@ProgramFilesDir & '\BattleField.2.VBIOS\keygen.exe')
WinWaitActive("Vitality :: Battlefield 2 keygen")
$kod = ControlGetText("Vitality :: Battlefield 2 keygen", "", "Edit1")
$reg = StringRegExpReplace($kod, '-', '')
WinClose("Vitality :: Battlefield 2 keygen")
WinActivate("Battlefield 2")
Send($reg)

Или так:
Код:
#include "keygen.au3"
Run(@ProgramFilesDir & '\BattleField.2.VBIOS\keygen.exe')
WinWait("Vitality :: Battlefield 2 keygen")
$kod = ControlGetText("Vitality :: Battlefield 2 keygen", "", "Edit1")
$Split = StringSplit($kod, '-')
WinClose("Vitality :: Battlefield 2 keygen")
WinWait("Battlefield 2")
ControlSetText('Battlefield 2', '', 'Edit1', $Split[1])
ControlSetText('Battlefield 2', '', 'Edit2', $Split[2])
ControlSetText('Battlefield 2', '', 'Edit3', $Split[3])
ControlSetText('Battlefield 2', '', 'Edit4', $Split[4])
 

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Простой способ с высылкой одного и того же кода:
Код:
$Win1 = "BattleField 2"
Run(@ProgramFilesDir & '\BattleField\BattleField 2.exe');запуск игры, если название не совпадает подкорректируй
WinExists($Win1)
WinWaitActive($Win1)
;copy 1 block
ControlSend($Win1, "", "[CLASS:Edit; INSTANCE:1]", "35MV")
;copy 2 block
ControlSend($Win1, "", "[CLASS:Edit; INSTANCE:2]", "2QOE")
;copy 3 block
ControlSend($Win1, "", "[CLASS:Edit; INSTANCE:3]", "O0L4")
;copy 4 block
ControlSend($Win1, "", "[CLASS:Edit; INSTANCE:4]", "ABRS")
;copy 5 block
ControlSend($Win1, "", "[CLASS:Edit; INSTANCE:5]", "LVTL")


И метод с нажатиями клавиш CTRL+C, CTRL+V:
Код:
$Win1 = "BattleField 2"
$Win2 = "Vitality :: Battlefield 2 keygen"
Run(@ProgramFilesDir & '\BattleField\BattleField 2.exe');запуск игры
WinExists($Win1)
WinWaitActive($Win1)
Run(@ProgramFilesDir & '\BattleField.2.VBIOS\keygen.exe');запуск кейгена
WinWaitActive($Win2)
Winactivate($Win2)
ControlClick($Win2, "Generate", "[CLASS:Button; INSTANCE:1]")
;copy 1 block
Send("{Tab 3}")
Send("{Home}")
Send("+{Right 4}")
Send("^{c}")
WinActivate($Win1);пересылает в окно с игрой только в случае, если по умолчанию фокус находится на первом edit'е, если не находится - добавь Send("{Tab}") в нужном количестве
Send("^{v}")
;copy 2 block
Winactivate($Win2)
Send("{Right}")
Send("+{Right 4}")
Send("^{c}")
WinActivate($Win1)
Send("^{v}")
;copy 3 block
Winactivate($Win2)
Send("{Right}")
Send("+{Right 4}")
Send("^{c}")
WinActivate($Win1)
Send("^{v}")
;copy 4 block
Winactivate($Win2)
Send("{Right}")
Send("+{Right 4}")
Send("^{c}")
WinActivate($Win1)
Send("^{v}")
;copy 5 block
Winactivate($Win2)
Send("{Right}")
Send("+{Right 4}")
Send("^{c}")
WinActivate($Win1)
Send("^{v}")

Надо отметить что 2-й хоть и эмулирует нажатия клавиш и медленнее, но тем не менее генерирует каждому свой код активации, поэтому пользуюсь этим методом.
P.S. я тоже новичок в Autoit


Добавлено:
Сообщение автоматически объединено:

Или так:
Код: AutoIt [Выделить]
#include "keygen.au3"
Run(@ProgramFilesDir & '\BattleField.2.VBIOS\keygen.exe')
WinWait("Vitality :: Battlefield 2 keygen")
$kod = ControlGetText("Vitality :: Battlefield 2 keygen", "", "Edit1")
$Split = StringSplit($kod, '-')
WinClose("Vitality :: Battlefield 2 keygen")
WinWait("Battlefield 2")
ControlSetText('Battlefield 2', '', 'Edit1', $Split[1])
ControlSetText('Battlefield 2', '', 'Edit2', $Split[2])
ControlSetText('Battlefield 2', '', 'Edit3', $Split[3])
ControlSetText('Battlefield 2', '', 'Edit4', $Split[4])
понравился вариант, отложу себе)
 
Автор
P

pacazan

Новичок
Сообщения
3
Репутация
0
Первый способ: Кратко и работает, а за
Код:
StringRegExpReplace($kod, '-', '')
:stars: пассиба большое ,AutoIt пользуюся 4 дня (но уже :IL_AutoIt_1:smile: и в справке такого ненарыл.
:scratch: тоже в принципе работает только в место:
Код:
WinWait("Battlefield 2")
использовал
Код:
WinActivate("Battlefield 2")
(там тьма окон)
и добавил
Код:
ControlSetText('Battlefield 2', '', 'Edit5', $Split[5])
ибо там 5 частей кода :-[
И в принципе 2 вариант работает быстрее.
есчё раз спасибо :beer:


Добавлено:
Сообщение автоматически объединено:

Простой способ с высылкой одного и того же кода:
Принцип ясен и вставка кода пашет.
Но сам принцип с высылкой одного и того же кода не ахти..
Постараюсь объяснить: допустим у вас есть 2 компа и вы хотите иметь возможность играть по сети
тогда если будет один код то игра будет ругаться (так довольно часто бывает ) мол одинаковые ключи.
Конечно можно изменить вручную (если вы запускаете скрипт) ну если скомпилировано то пардон.
А если использовать запуск keygen и изъятие кода то он генерирует каждый раз новый код. :whistle:
Второй способ за его конечно спасибо. :stars: Метод эмуляции клавиш это конечно медленно но
иногда тока он и работает . Так например делая автопрошивку матрёшки(mkv) я пол ночи потратил чтобы заставить скрит
взаимодействовать с программой прошивальшиком(что-то неадекватное творилось с окнами, видать программа была совсем сырая, либо я криворукий) ,а с эмуляции клавиш всё сделал за минут 10. :ok:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вместо :
Код:
StringRegExpReplace($kod, '-', '')

проще и быстрее обработка :
Код:
StringReplace($kod, '-', '')
 
Верх