Я создал простой скрипт, который пытается вычислить эквити, введите здесь описание ссылки:
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 код работает нормально...