前の月 / 次の月 / 最新

hiChangeLog / 2008-07

2008-07
SMTWTFS
12345
6789101112
13141516171819
20212223242526
2728293031

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

2008-07-03 Thu

ツールバーのボタンを外部プログラムから押すにはどうすればよいか [Windowsプログラミング]

SendInputでクリックイベントを送るのが確実だけど、位置合わせが面倒。

ボタンのウィンドウハンドルを取得すればどうにでもなると思ったが、あまり単純な話ではないようだ。
http://m--takahashi.com/bbs/pastlog/06400/06309.html

なんで、押すこと自体は諦め、代わりにSendInputからキーイベントを送ってメニューから実行したと見做させるのが良いように思う。

pythonからSendInput [Windowsプログラミング][python][PyWin32]

下記は、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