控制一窗台应用程序w/stdin管
-
05-09-2019 - |
题
我试图控制一个控制台应用程序(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 附带)- 允许您查看进入窗口的消息
- 斯特雷斯 允许您查看进程正在执行哪些系统调用。
不隶属于 StackOverflow