Добрый день,
Я в 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 и всё ОК
Здравствуйте, sergeii, Вы писали:
S>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет, хотя они видны, стираю последнюю цифру и заново её ввожу тогда опять жму Enter и всё ОК
S>Что это такое и как с этим бороться?
Возможно, это простейшая защита от роботов.
Программа смотрит не только на собственно содержимое поля ввода, но и на активность пользователя.
Если пользователь вводит что-то руками — контрол фокусируется, получает какие-то события клавиатуры и/или мыши, отправляет нотификации родительскому окну...
А если туда программно записать строку — никаких событий, кроме собственно WM_SETTEXT, не происходит.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, sergeii, Вы писали:
S>>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет, хотя они видны, стираю последнюю цифру и заново её ввожу тогда опять жму Enter и всё ОК
S>>Что это такое и как с этим бороться?
К>Возможно, это простейшая защита от роботов. К>Программа смотрит не только на собственно содержимое поля ввода, но и на активность пользователя. К>Если пользователь вводит что-то руками — контрол фокусируется, получает какие-то события клавиатуры и/или мыши, отправляет нотификации родительскому окну... К>А если туда программно записать строку — никаких событий, кроме собственно WM_SETTEXT, не происходит.
Тогда может могли-бы подсказать как поступить с этим, может есть какой пример? или где можно об этом прочитать,
П.С. Я уже пробовал VK_RETURN посылать не пожезло
Здравствуйте, sergeii, Вы писали:
К>>Возможно, это простейшая защита от роботов.
<> S>Тогда может могли-бы подсказать как поступить с этим, может есть какой пример? или где можно об этом прочитать, S>П.С. Я уже пробовал VK_RETURN посылать не пожезло
Пример очень простой: запускаешь Spy++ и смотришь, какие события прилетают в контрол и из контрола к родителю при ручном вводе.
Делаешь выводы.
Во всяком случае, там не просто WM_KEYDOWN, но и WM_KEYUP, и WM_CHAR, и не забыть сперва установить фокус...
К тому же, клавиатурные события обрабатываются более затейливо, чем просто WM_KEYDOWN(VK_RETURN) непосредственно контролу.
В цикле прокачки GetMessage/IsDialogMessage/TranslateMessage/DispatchMessage происходит опрос: какое окно должно получить данное событие. Для этого сфокусированный контрол и его родители получают WM_GETDLGCODE.
Однострочный эдит-бокс вообще не должен получать VK_RETURN.
Здравствуйте, sergeii, Вы писали:
S>Handl получаю правельный, Данные записываются в Caption поля, прикол ж том что когда я жму Enter то получаю ошибку мол данных в поле нет
Что за ошибка такая ? Кто ее выдает — исполнительная система Питона ? В Win32 при нажатии Enter всего лишь приходит WM_COMMAND с кодом IDOK, а что уж тут делать — определяется обработчиком WM_COMMAND.
У меня большое подозрение, что делать это все надо не через Win API, а как положено в Питоне. Питон я не знаю, но если в C#, например, напрямую заслать текст в контрол, то никто не будет изменять свойство .Text у этого контрола, а оно должно содержать копию этой строки. Может, и в Питоне тоже что-то есть. У него вообще какие-то родные средства работы с окнами есть ?
Здравствуйте, 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 (если проблема в этом).
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 (если проблема в этом).