Вверх ↑
Этот топик читают: Гость
Ответов: 327
Рейтинг: 5
#1: 2014-06-18 00:50:56 ЛС | профиль | цитата
Есть игра, называется World of Warcraft... При запуске игры запрашивается логин и пароль, логин можно указать в конфиг файле и при запуске он уже будет введен в поле "логин", так же есть второе поле "пароль", так вот пароль нельзя записать в конфиг файл и приходится вводить(заполнить это поле с помощью SendMessage не составляет труда), тут начинаются проблемы...
Сначала нужно запустить игру, затем дождаться момента когда появятся поля для заполнения, поля появляются с задержкой, у всех задержка разная т.к. мощность системы тоже разная.

Если вводить пароль до появления поля, то он банально не вводится(и это логично), либо вводится частично.

Вопрос таков. Как определить тот момент, когда поле уже появилось?
карма: 0

0
Ответов: 1328
Рейтинг: 69
#2: 2014-06-18 03:49:38 ЛС | профиль | цитата
knoot0279, например раз в сек с помощью SendMessage пытаться получить "логин" при получении вставлять пароль..
карма: 2

0
Ответов: 327
Рейтинг: 5
#3: 2014-06-18 10:54:49 ЛС | профиль | цитата
спасибо, попробую
------------ Дoбавленo в 10.54:
Что-то я запутался с wm_keydown...
Add(SendMessage,13248187,546,525)
{
Point(Message)
link(WParam,7098295:Value,[])
link(LParam,5314310:Value,[(566,504)(601,504)])
link(Message,7298239:Value,[(573,508)(643,508)])
}
Add(Memory,7298239,637,462)
{
@Hint=#7:WM_CHAR|
Default=Integer(256)
}
Add(Memory,7098295,553,462)
{
@Hint=#4:Char|
Default=Integer(9)
AddHint(32,-56,37,13,@Hint)
}
Add(Memory,5314310,595,462)
{
Default=Integer(0)
}


Вызывает задержку "реального" нажатия кнопки клавиатуры.
В коде выше, пытаюсь нажать таб и ничего не происходит, только вижу секундную задержку при нажатии кнопки "таб" на клавиатуре.
А с энтером вообще интересно получается... так же наблюдается задержка, но, после нажатия вручную, получаю окно с предупреждением "введите логин"(это нормально, поле логин пустое), и если я закрываю окно при помощи "esc" или нажатием мыши на кнопку "ок", то он заново открывает окно, то есть он сам нажимает энтер.

З.Ы.
стоит бесконечный цикл на "sendmessage".
почему он нажимает энтер только после моего нажатия?
карма: 0

0
Ответов: 1343
Рейтинг: 31
#4: 2014-06-18 20:30:44 ЛС | профиль | цитата
Konst писал(а):
например раз в сек с помощью SendMessage пытаться получить "логин" при получении вставлять пароль..


бред и ненужный мусор...

делай всё через MEMPATCH
и не надо никаких мессиджей и прочих соплей...
просто находишь все адреса до загрузки и после загрузки, закр. игру опять откр. опять отсеиваешь итд пока не найдёшь то самое...

и аналогично с текстом... пишешь текст отвеиваешь меняешь отсеиваешь итд

ну и как бы не будет соплей всяких, а будет уже чётко всё.
карма: 2

0
Ответов: 327
Рейтинг: 5
#5: 2014-06-19 04:48:55 ЛС | профиль | цитата
Как с этим вообще работать? Как это помочь мне может?
карма: 0

0
Ответов: 1058
Рейтинг: 76
#6: 2014-06-19 12:08:54 ЛС | профиль | цитата
knoot0279 писал(а):
приходится вводить(заполнить это поле с помощью SendMessage не составляет труда
knoot0279 писал(а):
Как определить тот момент, когда поле уже появилось

knoot0279 Не вникая в суть проблемы...
Ваша логика со стороны смотрится весьма странной
Если нет проблем с помощью SendMessage заполнить поле, то почему для Вас проблематично, с помощью того же SendMessage, проверить наличие(доступностьвидимость и прочее) нужного поля ввода?

Чтобы заполнить поле ввода нужно найти его handle, соответственно если не удалось найти handle значит поле ввода еще не появилось.

knoot0279 писал(а):
Как с этим вообще работать? Как это помочь мне может?

Rysik намекает что можно редактировать данные непосредственно в памяти. Также для начала любым удобным софтом найти нужный адрес, а далее с помощью MEMPATCH по найденному адресу внести необходимые правки.
карма: 0

0
Ответов: 327
Рейтинг: 5
#7: 2014-06-19 12:14:10 ЛС | профиль | цитата
tom-it писал(а):
Если нет проблем с помощью SendMessage заполнить поле, то почему для Вас проблематично, с помощью того же SendMessage, проверить наличие(доступностьвидимость и прочее) нужного поля ввода?


Я не могу заставить его нажимать такие кнопки как :
Tab
Ctrl+C
Enter
карма: 0

0
Ответов: 1058
Рейтинг: 76
#8: 2014-06-19 12:35:02 ЛС | профиль | цитата
knoot0279 писал(а):
Я не могу заставить его нажимать такие кнопки как

Опишите более понятно что, как и для чего делаете.


[offtop]мысли вслух

Если Вы отправляете SendMessage, значит Вам известно handle формы с полями ввода.
Далее ищем дочерние окна, тоесть нужное поле ввода и кнопку.
Если для поиска нету отличительных признаков (одинаковые ClassName, Caption и пр.), используем относительные координаты элементов.
Далее отправляем пароль и нажатие кнопки.

И не понятно для чего
knoot0279 писал(а):
Tab
Ctrl+C
Enter
[/offtop]
карма: 0

0
Ответов: 4630
Рейтинг: 749
#9: 2014-06-19 12:35:45 ЛС | профиль | цитата
Возможно, окно не в фокусе (перед посылкой команд вывести окно на передний план).
карма: 26

0
Ответов: 327
Рейтинг: 5
#10: 2014-06-19 15:01:16 ЛС | профиль | цитата
Netspirit писал(а):
Возможно, окно не в фокусе

Окно в любом случае в фокусе т.к. игра была только что запущена.
Netspirit писал(а):
Опишите более понятно что, как и для чего делаете.

При запуске игры поле "логин" заполнено и поэтому фокус автоматически переключается на поле "пароль" нажатием Tab'а я хочу вернуть фокус на первое поле, после чего копировать текст(Ctrl+C) и проверить равен ли он тому, чего я ожидаю(а ожидаю я совпадения с известным мне логином, ибо если поля не появились, то он и не скопирует).

Хотя сейчас подумав... комбинация Ctrl+C ведь скопирует в буфер обмена, не так ли?(хотя можно записать старое значение, проверить логин и вернуть старое...)
В общем нужно каким то образом определить содержимое первого поля. Менять данные в буфере не желательно.

А Enter мне нужен для того, чтобы войти(присутствует кнопка "войти", нажатие кнопки Enter равносильно клику на кнопку "войти")
карма: 0

0
Ответов: 4630
Рейтинг: 749
#11: 2014-06-19 15:10:32 ЛС | профиль | цитата
knoot0279 писал(а):
определить содержимое первого поля
FindWindow+WM_GETTEXT (WM_GETTEXT вероятно нужно в InlineCode)
карма: 26

0
Ответов: 327
Рейтинг: 5
#12: 2014-06-19 15:11:52 ЛС | профиль | цитата
Почему в InlineCode?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#13: 2014-06-19 15:17:29 ЛС | профиль | цитата
Можешь попробовать WinTools.CaptionText, но он использует GetWindowText, а в MSDN пишут, что не удастся получить текст Edit-а из другого процесса.
карма: 26

0
Ответов: 327
Рейтинг: 5
#14: 2014-06-19 15:23:39 ЛС | профиль | цитата
tom-it писал(а):
Далее ищем дочерние окна, тоесть нужное поле ввода и кнопку.

Если я правильно понимаю... вы предлагаете перебором дочерних окон найти поля и кнопку, так?
У меня получилось следующее
Add(FindWindow,12848742,126,119)
{
Caption="World of Warcraft"
SkipParam=2
link(onFind,16572389:doEnumChildWindows,[(170,125)(170,146)])
}
Add(WinEnum,16572389,182,119)
{
VisibleOnly=1
Point(doEnumChildWindows)
Point(onEnumChildWindows)
Point(ParentHandle)
}


Ничего не находит...
Ну, то есть главное он находит, а дочерние нет
карма: 0

0
Ответов: 4630
Рейтинг: 749
#15: 2014-06-19 15:40:52 ЛС | профиль | цитата

Add(MainForm,2953706,21,105)
{
}
Add(Button,3342741,98,168)
{
Left=290
Top=20
Width=100
Caption="Search"
link(onClick,12848742:doFind,[])
}
Add(InlineCode,1703974,336,168)
{
WorkPoints=#15:doGetWindowText|
EventPoints=#8:onResult|
DataPoints=#9:WinHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|42:uses Windows, kol, Share, Debug, Messages;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: WinHandle: THI_Event;|25: onResult: THI_Event;|60: procedure doGetWindowText(var _Data:TData; index:word);|0:|5: end;|0:|14:implementation|0:|38:procedure THiAsmClass.doGetWindowText;|3:var|13: H: THandle;|14: Buf: string;|7:begin |40: H := ReadInteger(_Data, WinHandle, 0);|57: SetLength(Buf, SendMessage(H, WM_GETTEXTLENGTH, 0, 0));|80: SetLength(Buf, SendMessage(H, WM_GETTEXT, Length(Buf)+1, LPARAM(PChar(Buf))));|41: _hi_CreateEvent(_Data, @onResult, Buf);|4:end;|0:|0:|0:|0:|4:end.|
link(onResult,9311008:doAdd,[])
}
Add(Edit,5270799,175,112)
{
Left=60
Top=20
Width=220
Text="Window Title"
}
Add(Label,10033591,21,168)
{
Left=10
Top=25
Width=43
Height=17
Caption="Caption:"
}
Add(FindWindow,12848742,161,168)
{
SkipParam=2
link(onFind,16572389:doEnumChildWindows,[])
link(Caption,5270799:Text,[])
}
Add(WinEnum,16572389,224,147)
{
Point(doEnumChildWindows)
Point(onEnumChildWindows)
Point(ParentHandle)
link(onEnumChildWindows,11437630:doSeparateMT,[])
}
Add(Memo,9311008,406,168)
{
Left=10
Top=50
Width=355
Height=210
ScrollBars=3
}
Add(MT_MultiData,11437630,280,161)
{
Count=3
link(onData2,1703974:doGetWindowText,[])
}

Это только для эксперимента. В конечной программе вместо WinEnum.doEnumChildWindows используй FindWindow.doFindChild с нужным классом окна.

Если взять результат с 3-ей точки MT_MultiData в обход IC, то текст Edit-ов будет выдавать пустой.

[offtop]А WinTools.CaptionText можно переделать на использование этого метода...[/offtop]

карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)