Я создал простой скрипт, который пытается вычислить эквити введите описание ссылки здесь:
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 свернут, у меня нет этой проблемы.
Я подозреваю, что сделал что-то не так с отправкой сообщений в поля редактирования. Потому что, если я заполняю их вручную и нажимаю кнопку, то все в порядке. Когда я заполняю его, используя set_hand
функции, то даже если я нажму кнопку вручную, я получу этот странный результат.
Так что не так с моим сценарием?
РЕДАКТИРОВАТЬ:
Когда я подключаю spy ++ к EvaluateButton, я вижу, что кнопка все еще получает сообщение WM_SETTEXT, в котором для нее установлено значение «Стоп (завершено на 99%)».
EDIT2:
Он был протестирован на Windows 7. Но дома на Windows XP в VirtualBox код работает нормально …
Вы отправляете символы с PostMessage
, Эта функция асинхронная. Хм, результаты следования SendMessage могут быть странными.
Других решений пока нет …