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

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

  1. 启动软件
  2. 填写用户名
  3. 按标签
  4. 填写密码
  5. 按回车

我无法执行第 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 自动化?

标签: python winapi pywin32 win32gui


【解决方案1】:

PostMessage 可能返回一个非零值。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2011-11-27
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2014-03-19
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多