Что не так с моей частью кода SendMessage/PostMessage?

Я создал простой скрипт, который пытается вычислить эквити, введите здесь описание ссылки:

import time
import win32api
import win32con

from pywinauto import application

def getEquity(ps_pid, hand1, hand2):
    def set_hand(handle, hand, kf=0):
        win32api.SendMessage(handle, win32con.WM_SETFOCUS, 0, 0) # f: losefocus
        #win32api.SendMessage(handle, win32con.WM_GETDLGCODE, 0, 0)
        time.sleep(0.05)
        len = win32api.SendMessage(handle, win32con.WM_GETTEXTLENGTH, 0, 0)
        time.sleep(0.05)
        win32api.SendMessage(handle, win32con.EM_SETSEL, 0, len)
        time.sleep(0.05)
        for c in hand:
            win32api.PostMessage(handle, win32con.WM_CHAR, ord(c), 0)
            #win32api.SendMessage(handle, win32con.WM_GETDLGCODE, 0, 0)
            time.sleep(0.05)
        win32api.SendMessage(handle, win32con.WM_KILLFOCUS, 0, 0)

    app = application.Application()
    app.connect_(process=ps_pid)

    set_hand(app.PokerStove.REdit1.handle, hand1)
    set_hand(app.PokerStove.REdit2.handle, hand2)

    app.PokerStove.Evaluate.Click()
    while app.PokerStove.EvaluateButton.WindowText() != 'Evaluate':
        time.sleep(0.1)

    return app.PokerStove.Edit12.GetLine(0)

import sys
print getEquity(int(sys.argv[1]), sys.argv[2], sys.argv[3])

Я решил использовать оконные сообщения вместо SendKey, потому что мне нужно, чтобы он работал и тогда, когда PokerStove свернут.

Этот скрипт отлично работает, когда PokerStove свернута. Но странные вещи случаются, когда это не так. Скрипт правильно заполняет текстовые правки и нажимает кнопку, и я получаю правильные результаты. Но после этого измените его подпись на что-то странное:

PokerStove

Итак, похоже, что PokerStove все еще работает, но результаты уже готовы. Из-за этого изменения, когда я снова запускаю свой скрипт, он не работает. Но когда PokerStove свернут, у меня нет этой проблемы.

Я подозреваю, что я сделал что-то не так с отправкой сообщений в поля редактирования. Потому что если я заполню их вручную и нажму кнопку, то все в порядке. Когда я заполняю его с помощью функции set_hand, то даже если я нажму кнопку вручную, я получу этот странный результат.

Так что не так с моим сценарием?

ИЗМЕНИТЬ:

Когда я подключаю spy++ к EvaluateButton, я вижу, что эта кнопка по-прежнему получает сообщение WM_SETTEXT, которое устанавливает для нее значение «Стоп (99% завершено)».

EDIT2:

Тестировалось на Windows 7. Но дома на Windows XP в VirtualBox код работает нормально...


person Adam    schedule 06.09.2012    source источник


Ответы (1)


Вы отправляете символы с помощью PostMessage. Эта функция является асинхронной. Хм, результаты следования за SendMessage могут быть странными.

person Maximus    schedule 06.09.2012
comment
Завтра перепроверю, так как дома воспроизвести не могу (что тоже странно). - person Adam; 06.09.2012
comment
Когда я использую win32api.SendMessage для отправки символов, я получаю ту же проблему в Windows 7. - person Adam; 07.09.2012
comment
Попробуйте использовать шпион для окна и всех детей, чтобы определить разницу между закодированными сообщениями и результатом реальных нажатий клавиш. - person Maximus; 07.09.2012
comment
Ну, на самом деле вы отправляете ввод с помощью SendInput. - person David Heffernan; 07.09.2012
comment
@DavidHeffernan, но я хочу взаимодействовать со свернутым приложением. Поэтому я не думаю, что смогу использовать SendInput. - person Adam; 10.09.2012
comment
@Maximus, я пытался это сделать. Но сообщений много. Похоже, мне придется потратить гораздо больше времени, чтобы проанализировать и понять их. - person Adam; 10.09.2012
comment
Потому что я знаю, что они есть. Этот вопрос не о том, как купить какое-то приложение. Но упирайтесь в то, как я могу исправить существующую проблему. - person Adam; 10.09.2012
comment
Я не уверен, что ваша программа соответствует лицензии PokerStove. - person Andrew Prock; 14.09.2012