我试图控制一个控制台应用程序(JTAG应用程序从Segger)从使用Python子流程模块。该应用程序的行为正确为stdout,但stdin似乎不能阅读。如果使外壳,我可以输入到输入和控制的应用程序,但我需要这样做,以编程方式。相同的代码工作的现用于发出命令之类的东西cmd.exe.

我猜那个键盘正在读,而不是直接的stdin。任何想法如何,我可以发送的申请输入?

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()
有帮助吗?

解决方案

作为shoosh说,我会尝试,以验证程序确实是在寻找键盘输入。如果是,你可以尝试Win32消息传递,或发送键盘输入可通过自动化。

为消息的传递途径,可以使用 EnumWindows 功能通过ctypes找到窗口,然后使用问题向它发送WM_KEYDOWN消息。

你也可以把键盘输入通过 pywinauto, 或控件的 AutoIt 通过win32com.

使用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")

其他提示

I'm guessing that the keyboard is being read directly instead of stdin

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

  • 等待主窗口循环中的键盘事件。如果是这种情况,那么您只需向窗口发送正确类型的消息即可模拟键盘。这些可能会枯萎 WM_KEYDOWN 或者 WM_CHAR 或者也许是其他一些相关的变体。
  • 实际上轮询硬件,例如使用 GetAsyncKeyState(). 。这有点不太可能,如果这确实是正在发生的事情,我怀疑您可以采取任何措施以编程方式模拟它。

另一种方法是尝试使用屏幕键盘,看看它是否适用于该应用程序。如果是这样,找出如何模拟它的作用。

一些可能有用的工具 -

  • Spy++(Visual Studio 附带)- 允许您查看进入窗口的消息
  • 斯特雷斯 允许您查看进程正在执行哪些系统调用。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top