EditBox
От: sergeii  
Дата: 23.09.10 06:34
Оценка:
Добрый день,
Я в WinAPI ламер, может может подсказать как мне в EditBox записать текст, пробовал сделать так
(пишу на Python):
EditBoxas = win32gui.FindWindowEx(vaikas2, None, 'XSMS:Edit', None)
print hex(EditBoxas)
win32gui.SendMessage( EditBoxas,win32con.WM_SETTEXT , None, "LT1234567890")
Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет, хотя они видны, стираю последнюю цифру и заново её ввожу тогда опять жму Enter и всё ОК

Что это такое и как с этим бороться?

Спасибо
Re: EditBox
От: Кодт Россия  
Дата: 23.09.10 09:25
Оценка:
Здравствуйте, sergeii, Вы писали:

S>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет, хотя они видны, стираю последнюю цифру и заново её ввожу тогда опять жму Enter и всё ОК


S>Что это такое и как с этим бороться?


Возможно, это простейшая защита от роботов.
Программа смотрит не только на собственно содержимое поля ввода, но и на активность пользователя.
Если пользователь вводит что-то руками — контрол фокусируется, получает какие-то события клавиатуры и/или мыши, отправляет нотификации родительскому окну...
А если туда программно записать строку — никаких событий, кроме собственно WM_SETTEXT, не происходит.
Перекуём баги на фичи!
Re[2]: EditBox
От: sergeii  
Дата: 23.09.10 12:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, sergeii, Вы писали:


S>>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет, хотя они видны, стираю последнюю цифру и заново её ввожу тогда опять жму Enter и всё ОК


S>>Что это такое и как с этим бороться?


К>Возможно, это простейшая защита от роботов.

К>Программа смотрит не только на собственно содержимое поля ввода, но и на активность пользователя.
К>Если пользователь вводит что-то руками — контрол фокусируется, получает какие-то события клавиатуры и/или мыши, отправляет нотификации родительскому окну...
К>А если туда программно записать строку — никаких событий, кроме собственно WM_SETTEXT, не происходит.

Тогда может могли-бы подсказать как поступить с этим, может есть какой пример? или где можно об этом прочитать,
П.С. Я уже пробовал VK_RETURN посылать не пожезло
Re[3]: EditBox
От: Кодт Россия  
Дата: 23.09.10 13:14
Оценка:
Здравствуйте, sergeii, Вы писали:

К>>Возможно, это простейшая защита от роботов.


<>
S>Тогда может могли-бы подсказать как поступить с этим, может есть какой пример? или где можно об этом прочитать,
S>П.С. Я уже пробовал VK_RETURN посылать не пожезло

Пример очень простой: запускаешь Spy++ и смотришь, какие события прилетают в контрол и из контрола к родителю при ручном вводе.
Делаешь выводы.

Во всяком случае, там не просто WM_KEYDOWN, но и WM_KEYUP, и WM_CHAR, и не забыть сперва установить фокус...

К тому же, клавиатурные события обрабатываются более затейливо, чем просто WM_KEYDOWN(VK_RETURN) непосредственно контролу.
В цикле прокачки GetMessage/IsDialogMessage/TranslateMessage/DispatchMessage происходит опрос: какое окно должно получить данное событие. Для этого сфокусированный контрол и его родители получают WM_GETDLGCODE.

Однострочный эдит-бокс вообще не должен получать VK_RETURN.
Перекуём баги на фичи!
Re: EditBox
От: Pavel Dvorkin Россия  
Дата: 23.09.10 15:17
Оценка:
Здравствуйте, sergeii, Вы писали:

S>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет


Что за ошибка такая ? Кто ее выдает — исполнительная система Питона ? В Win32 при нажатии Enter всего лишь приходит WM_COMMAND с кодом IDOK, а что уж тут делать — определяется обработчиком WM_COMMAND.

У меня большое подозрение, что делать это все надо не через Win API, а как положено в Питоне. Питон я не знаю, но если в C#, например, напрямую заслать текст в контрол, то никто не будет изменять свойство .Text у этого контрола, а оно должно содержать копию этой строки. Может, и в Питоне тоже что-то есть. У него вообще какие-то родные средства работы с окнами есть ?
With best regards
Pavel Dvorkin
Re: EditBox
От: rus blood Россия  
Дата: 23.09.10 19:49
Оценка:
Здравствуйте, sergeii, Вы писали:

S>Что это такое и как с этим бороться?


Скорее всего, приложение "следит" за вводимым текстом.
Обычно для этого используется EN_CHANGE, который EditBox шлет своему родителю.
В MSDN есть замечание

The EN_CHANGE notification code is not sent when the ES_MULTILINE style is used and the text is sent through WM_SETTEXT.


Можно попробовать "набрать" текст побуквенно (WM_CHAR) или сэмулировать этот EN_CHANGE (если проблема в этом).
Имею скафандр — готов путешествовать!
Re[2]: EditBox
От: sergeii  
Дата: 24.09.10 05:06
Оценка:
Добрый день всем.

Спасибо за ответы они мне очень помогли. В конце концоВ сделал так :

win32gui.SendMessage( EditBoxas,win32con.WM_SETFOCUS , None, None)
win32gui.SendMessage( EditBoxas,win32con.WM_SETTEXT , None, "7890")
win32gui.SendMessage( EditBoxas,win32con.WM_KEYDOWN , ord("L"), None)
win32gui.SendMessage( EditBoxas,win32con.WM_CHAR , ord("L"), None)
win32gui.SendMessage( EditBoxas,win32con.WM_KEYUP , ord("L"), None)
win32gui.SendMessage( artikulas,win32con.WM_KEYDOWN , win32con.VK_RETURN, None)
win32gui.SendMessage( artikulas,win32con.WM_KEYUP , win32con.VK_RETURN, None)

и всё зараотало
Ещё раз спасибо за помощ




RB>Здравствуйте, sergeii, Вы писали:


S>>Что это такое и как с этим бороться?


RB>Скорее всего, приложение "следит" за вводимым текстом.

RB>Обычно для этого используется EN_CHANGE, который EditBox шлет своему родителю.
RB>В MSDN есть замечание
RB>

RB>The EN_CHANGE notification code is not sent when the ES_MULTILINE style is used and the text is sent through WM_SETTEXT.


RB>Можно попробовать "набрать" текст побуквенно (WM_CHAR) или сэмулировать этот EN_CHANGE (если проблема в этом).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.