1

ここにリンクの説明を入力してエクイティを計算する簡単なスクリプトを作成しました。

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 を最小化すると、この問題は発生しません。

編集ボックスにメッセージを送信する際に何か問題があったのではないかと思います。手動で入力してボタンをクリックすると、すべて問題ありません。関数を使用して入力set_handすると、ボタンを手動でクリックしても、この奇妙な結果が得られます。

では、私のスクリプトの何が問題なのですか?

編集:

Spy++ を Eva​​luateButton に接続すると、ボタンが「停止 (99% 完了)」に設定された WM_SETTEXT メッセージを取得していることがわかります。

EDIT2:

それは Windows 7 でテストされました。しかし、VirtualBox コードの Windows XP の自宅では正常に動作しています...

4

1 に答える 1

1

で文字を送信しPostMessageます。この関数は非同期です。うーん、SendMessage をたどると変な結果になるかもしれません。

于 2012-09-06T17:39:15.527 に答える