使用什么SendMessage发送键盘输入到另一个窗口?

3 投票
1 回答
23116 浏览
提问于 2025-04-16 12:18

我正在尝试使用 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)

1 个回答

7

当我写这个问题的时候,我知道 SendKeys 是生成键盘输入的正确方法,而且在所有情况下都是有效的。不过,我不能使用 SendKeys,因为我的程序运行时,电脑会被其他人使用,这意味着随时可能会有鼠标点击,这样就会改变窗口的焦点,让 SendKeys 开始向错误的窗口发送输入。

我想知道的是,为什么我的代码特别不工作——我发送的消息类型是不是有问题?是 Post 还是 SendWPARAM 应该是什么?等等……答案可能是因为我把消息发送到了记事本窗口,而不是记事本内部的编辑控件——我怀疑这样做会有效。

总之,我尝试把输入发送到我想要它正常工作的应用程序,结果成功了:

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)

所以答案是,我在消息类型或消息内容上并没有做错,只是发送到了错误的地方。

撰写回答