我的SendMessage / PostMessage部分代码有什么问题?

时间:2012-09-06 16:06:26

标签: c++ python windows winapi pywinauto

我创建了一个简单的脚本,尝试通过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仍然在计算,但结果已经准备好了。由于这种变化,当我再次启动我的脚本时,它将失败。但是当PokerStove最小化时,我没有这个问题。

我怀疑在向编辑框发送邮件时我做错了。因为如果我手动填写它们并单击按钮,那么一切都很好。当我使用set_hand函数填充它时,即使我手动点击按钮,我也会得到这个奇怪的结果。

我的剧本出了什么问题?

修改

当我将spy ++连接到EvaluateButton时,我可以看到该按钮仍然会收到WM_SETTEXT消息,该消息将其设置为“Stop(99%Complete)”。

EDIT2:

它在Windows 7上进行了测试。但在Windows XP中的VirtualBox代码正常工作......

1 个答案:

答案 0 :(得分:1)

您使用PostMessage发送字符。这个函数是异步的。嗯,以下SendMessage的结果可能很奇怪。