SendMessage用于将密钥直接发送到另一个窗口?

Cla*_*diu 2 python winapi input pywin32

我正在尝试SendMessage将键盘输入发送到另一个窗口.我知道缺点,但我必须这样做,因为我必须发送几个键,我不能保证窗口将有焦点 - 所以当窗口没有焦点时这必须工作.

我正在通过尝试将密钥发送到记事本窗口来测试它.我尝试了以下变化,但没有一个有效:

def post_keys1(hwnd):
    win32api.SendMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys2(hwnd):
    win32api.PostMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys3(hwnd):        
    win32api.SendMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys4(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys5(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)

def post_keys6(hwnd):
    win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)
Run Code Online (Sandbox Code Playgroud)

Cla*_*diu 6

当我写这个问题时,我明白这SendKeys是生成键盘输入的正确方法,而且这是唯一适用于所有情况的方法.但是,我无法使用SendKeys,因为我的程序运行时将运行我的程序运行的计算机,这意味着可以随时发生鼠标单击,这将改变窗口的焦点并SendKeys开始发送输入到错误的窗口.

我想知道的是为什么特别是我的代码无法正常工作 - 我是否对我发送的消息类型做错了什么?PostSend?应该WPARAM是什么?等等......答案可能是因为我将消息发送到记事本窗口,而不是记事本中找到的编辑控件 - 我怀疑它会起作用.

无论如何,我尝试向我希望它实际工作的应用程序发送输入,这最终起作用:

def send_input_hax(hwnd, msg):
    for c in msg:
        if c == "\n":
            win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
            win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
        else:
            win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)
Run Code Online (Sandbox Code Playgroud)

所以答案是我在消息类型或消息内容方面没有做任何错误,只是到了一个不正确的目的地.