1

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

2 回答 2

3

正如 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")
于 2009-04-07T00:16:30.143 回答
2
I'm guessing that the keyboard is being read directly instead of stdin

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

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

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

一些可能有用的工具 -

  • Spy++(与 Visual Studio 一起提供)- 允许您查看进入窗口的消息
  • strace允许您查看进程正在进行的系统调用。
于 2009-04-06T22:40:50.060 回答