2012-09-06 48 views
1

我創建簡單的腳本,它試圖獲得的股權enter link description here計算:我的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]) 

我決定,因爲我需要它也在努力PokerStove最小化時使用的窗口消息,而不是SendKey。

當PokerStove最小化時,此腳本可以正常工作。但是如果不是,會發生奇怪的事情。腳本正確填寫文本編輯並單擊按鈕,我得到正確的結果。但在那之後改變了他的標題到一些奇怪的事情:

PokerStove

所以看起來PokerStove仍在計算,但結果準備就緒。由於這一變化,當我再次啓動我的腳本時,它會失敗。但是當PokerStove最小化時,我沒有這個問題。

我懷疑我發送郵件到編輯框有問題。因爲如果我手動填充它們並點擊按鈕,那麼一切都很好。當我使用set_hand函數填充它時,即使我手動點擊按鈕,我也會得到這個奇怪的結果。

那麼我的腳本有什麼問題?

編輯:

當我連接間諜++到EvaluateButton我可以看到按鈕仍然得到WM_SETTEXT消息也將它設定爲「停止(完成99%)」。

EDIT2:

它在Windows 7中,但在家裏在Windows XP在VirtualBox的代碼測試工作正常...

回答

1

您與PostMessage發送字符。這個功能是異步的。哼,下面的SendMessage的結果可能很奇怪。

+0

明天我會重新測試它,因爲我無法在家中複製它(奇怪的是)。 – Adam

+0

當我使用'win32api.SendMessage'發送字符時,我在Windows 7上遇到了同樣的問題。 – Adam

+0

嘗試使用間諜窗口和所有兒童來確定編碼消息和實際擊鍵結果之間的差異。 – Maximus