我创建了一个简单的脚本,尝试通过enter link description here计算出权益:
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%完成)”。
编辑2:
它已经在Windows 7上进行了测试。但是,在Windows XP上的家庭中,VirtualBox的代码可以正常工作。
最佳答案
您发送带有PostMessage
的字符。此功能是异步的。嗯,跟随SendMessage的结果可能很奇怪。