使用 Python 将按键发送到不同的窗口

Posted

技术标签:

【中文标题】使用 Python 将按键发送到不同的窗口【英文标题】:Sending key presses to a different window using Python 【发布时间】:2017-11-19 19:50:33 【问题描述】:

我正在尝试实现一些非常简单的事情 - 使用我想要的脚本:

    启动软件 填写用户名 按标签 填写密码 按回车

我无法执行第 3 步和第 5 步。这是我的代码:

import win32api
import win32gui
import win32con

def send_keys(hwnd, username, password):
    for c in username:
        win32api.PostMessage(hwnd, win32con.WM_CHAR, ord(c), 0)

    win32api.keybd_event(win32con.VK_TAB, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) # DOES NOT WORK
    for c in password:
        win32api.PostMessage(hwnd, win32con.WM_CHAR, ord(c), 0)

    win32api.keybd_event(win32con.VK_RETURN, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) # DOES NOT WORK


def main():
    [...] # Run software, it pops as foreground window
    hwnd = win32gui.GetForegroundWindow()
    send_keys(hwnd, 'some_username', 'some_password')


if __name__ == '__main__':
    main()

当我在记事本中运行脚本的按键部分 (send_keys) 时,它会正确发送选项卡和返回/输入键,但是它不适用于预期的软件。有什么建议么?

【问题讨论】:

一次tab 按键是否足以让您的密码输入成为焦点? 为什么每个人和他们的狗都痴迷于 UI 自动化应该通过伪造输入来完成的想法?当您需要自动化 UI 时,为什么不使用 UI 自动化? 【参考方案1】:

PostMessage 可能返回一个非零值。

如果您在PostMessage 之后调用GetLastError,您可能会得到 5=access denied。

在过去,每个人都可以从任何应用程序向任何窗口发送消息,但如今的安全性大部分时间都被禁止了。

您想要达到的目标可以通过SendInput 方法完成。

【讨论】:

以上是关于使用 Python 将按键发送到不同的窗口的主要内容,如果未能解决你的问题,请参考以下文章

将按键发送到嵌入式 Pygame

怎么使用EXTJS 实现点击一个按键然后弹出一个窗口,并且在弹出窗口时能发送请求到服务器然后接受

使用python将一些键发送到非活动窗口

python给qq好友发送消息

有没有办法使用 Capybara 将按键发送到 Webkit?

如何将键盘事件发送到 Pywin32 中的不同窗口?