如何取消隐藏并显示使用subprocess.popen()创建的进程?

时间:2014-04-29 15:27:00

标签: python windows python-2.7 subprocess

我正在尝试创建一个简单的命令行进程并将其显示给用户(我不希望隐藏进程):

import subprocess
import win32con 

kwargs = {}
info = subprocess.STARTUPINFO()
info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
info.wShowWindow = win32con.SW_SHOWMAXIMIZED
ExecuteString = ('process.cmd')
kwargs['startupinfo'] = info
sp = subprocess.Popen(ExecuteString, **kwargs)

它适用于例如notepad.exe但没有简单的process.cmd:

echo "This is a process run from python"
pause

我没有想法,如何实现这一目标。我发现了各种各样的东西,如何隐藏一个过程。但我希望实现相反的目标。 有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您似乎混淆了进程窗口的概念。所有窗口都与进程相关联,但某个进程可能与任何窗口无关。

您的简单批处理脚本是从cmd.exe进程解释的。如果您在双击打开批处理脚本时习惯了Windows的行为,可能会认为cmd.exe始终与窗口关联,但事实并非如此。您可以通过在现有命令提示符下运行cmd.exe来自行检查 - 它不会打开一个新窗口(例如,正在运行notepad.exe)。

在python中,进程运行“就好像”它们是从命令提示符运行的 - 这就是为什么你没有得到另一个窗口。

这实际上并没有回答这个问题,但它可能有助于理解问题。

答案 1 :(得分:0)

对于Windowed应用程序,您只需使用SW_HIDE常量而不是SW_SHOWMAXIMIZED

如果你还想覆盖启动终端窗口的控制台应用程序,我猜你想要运行这样的东西:

  1. 开始这个过程;
  2. 使用EnumWindows();
  3. 在您的EnumWindowsProc实施中,
  4. 检查您刚刚启动的流程所拥有的顶级窗口(使用GetParent())(使用GetWindowThreadProcessId())。
  5. 这将允许您找到刚刚启动的流程的顶级窗口。从那里,您可以致电ShowWindow()来显示/隐藏窗口。

    请注意,这可能会遇到一些时间问题(如果您的搜索在子进程创建窗口之前运行,搜索将不会产生任何结果)以及闪烁(因为您将隐藏窗口后面的窗口)显示器)。