【问题标题】:Controlling a Windows Console App w/ stdin pipe使用标准输入管道控制 Windows 控制台应用程序
【发布时间】:2009-04-06 22:01:25
【问题描述】:

我正在尝试使用 subprocess 模块从 Python 控制控制台应用程序(Segger 的 JTAG 应用程序)。应用程序在标准输出中表现正确,但似乎没有读取标准输入。如果启用 shell,我可以输入输入并控制应用程序,但我需要以编程方式执行此操作。相同的代码适用于向 cmd.exe 之类的命令发出命令。

我猜是直接读取键盘而不是标准输入。有什么想法可以发送应用程序输入吗?

from subprocess import Popen, PIPE, STDOUT
jtag = Popen('"C:/Program Files/SEGGER/JLinkARM_V402e/JLink.exe"', shell=True,
                        universal_newlines=True,
                        stdin=PIPE,
                        stdout=PIPE,
                        stderr=STDOUT)

jtag.stdin.write('usb\n')
jtag.stdin.flush()

print "Stdout:"
while True:
    s = jtag.stdout.readline()
    if not s:
        break
    print s,

jtag.terminate()

【问题讨论】:

    标签: python windows command-line subprocess jtag


    【解决方案1】:

    正如 shoosh 所说,我会尝试验证应用程序是否真的在寻找键盘输入。如果是,您可以尝试 Win32 消息传递,或通过自动化发送键盘输入。

    对于消息传递路径,你可以通过ctypes使用EnumWindows函数找到你想要的窗口,然后使用PostMessage向它发送WM_KEYDOWN消息。

    您也可以通过pywinauto 发送键盘输入,或通过win32com 发送AutoIt 的ActiveX 控件。

    使用 AutoIt:

    from win32com.client import Dispatch
    
    auto = Dispatch("AutoItX3.Control")
    auto.WinActivate("The window's title", "")
    auto.WinWaitActive("The window's title", "", 10)
    
    auto.Send("The input")
    

    【讨论】:

    • 此代码有效。唯一的问题是,如果用户点击某处,它会失去输入焦点,我必须打开外部终端而不是隐藏它。关于如何在隐藏子进程的同时做到这一点的任何想法?
    • EnumWindows -> PostMessage(hwnd, WM_KEYDOWN, ...) 应该允许您隐藏子进程,如果实际上问题在于子进程从击键读取输入,而不是标准输入。
    【解决方案2】:
    I'm guessing that the keyboard is being read directly instead of stdin
    

    这是一个相当强的假设,在拼接解决方案之前,您应该尝试以某种方式验证它。这样做有不同的层次。其实我现在能想到的有两个:

    • 等待来自主窗口循环的键盘事件。如果是这种情况,那么您可以简单地通过向窗口发送正确类型的消息来模拟键盘。这些可以是 WM_KEYDOWNWM_CHAR 或者其他一些相关的变体。
    • 实际上是轮询硬件,例如使用GetAsyncKeyState()。这有点不太可能,如果这真的发生了,我怀疑你可以做任何事情来以编程方式模拟它。

    对此的另一种看法是尝试使用屏幕键盘并查看它是否适用于应用程序。如果是,请弄清楚如何模拟它的作用。

    一些可能有用的工具 -

    • Spy++(随 Visual Studio 提供)- 允许您查看进入窗口的消息
    • strace 允许您查看进程正在进行的系统调用。

    【讨论】:

    • 该程序似乎正在监听 WM_KEYDOWN / WM_CHAR 消息事件,而不是查看标准输入。我不知道 StraceNT - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2013-09-27
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多