S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
SendInputでクリックイベントを送るのが確実だけど、位置合わせが面倒。
ボタンのウィンドウハンドルを取得すればどうにでもなると思ったが、あまり単純な話ではないようだ。
http://m--takahashi.com/bbs/pastlog/06400/06309.html
なんで、押すこと自体は諦め、代わりにSendInputからキーイベントを送ってメニューから実行したと見做させるのが良いように思う。
下記は、windowsのAPIのSendInputをpythonから呼ぶ例。
Adobe Readerに右矢印入力を10発送りこむ(開いてるPDFを10ページ進める)。エラー処理は省略。
この手のことはAutoHotKeyが専門だけど、pythonでできるにこしたことはない。
AppendKeyInput で win32con.KEYEVENTF_KEYUP を入れないと、同じキーの連続入力が出来ない。
http://mail.python.org/pipermail/python-win32/2005-April/003131.html を参照。
from ctypes import * import win32ui, win32con PUL = POINTER(c_ulong) class KeyBdInput(Structure): _fields_ = [("wVk", c_ushort), ("wScan", c_ushort), ("dwFlags", c_ulong), ("time", c_ulong), ("dwExtraInfo", PUL)] class HardwareInput(Structure): _fields_ = [("uMsg", c_ulong), ("wParamL", c_short), ("wParamH", c_ushort)] class MouseInput(Structure): _fields_ = [("dx", c_long), ("dy", c_long), ("mouseData", c_ulong), ("dwFlags", c_ulong), ("time",c_ulong), ("dwExtraInfo", PUL)] class Input_I(Union): _fields_ = [("ki", KeyBdInput), ("mi", MouseInput), ("hi", HardwareInput)] class Input(Structure): _fields_ = [("type", c_ulong), ("ii", Input_I)] def AppendKeyInput(vk): ret = [] extra = c_ulong(0) ii_ = Input_I() scan = windll.user32.MapVirtualKeyA(vk, 0) ii_.ki = KeyBdInput(vk, scan, 0, 0, pointer(extra) ) ret.append( ( win32con.INPUT_KEYBOARD, ii_ ) ) ii2_ = Input_I() scan = windll.user32.MapVirtualKeyA(vk, 0) ii2_.ki = KeyBdInput(vk, scan, win32con.KEYEVENTF_KEYUP, 0, pointer(extra) ) ret.append( ( win32con.INPUT_KEYBOARD, ii2_ ) ) return ret def ExecSendInput(inputs): num = len(inputs) FInputs = Input * num x = FInputs(*inputs) windll.user32.SendInput(num, pointer(x), sizeof(x[0])) if __name__ == '__main__': inputs = [] for i in range(10): inputs += AppendKeyInput(win32con.VK_RIGHT) acrobat = win32ui.FindWindowEx(None, None, 'AdobeAcrobat', None) acrobat.SetForegroundWindow() ExecSendInput(inputs)
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2010-03-08 22:21