如何显示通过subprocess.popen()创建的隐藏进程?
我正在尝试创建一个简单的命令行程序,并希望把它展示给用户(我不想让这个程序隐藏起来):
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
对于窗口应用程序,你只需要用 SW_HIDE
这个常量来替代 SW_SHOWMAXIMIZED
。
如果你还想处理那些会启动终端窗口的控制台应用程序,我猜你可能需要做以下几步:
- 启动这个进程;
- 使用 EnumWindows();
- 在你的
EnumWindowsProc
实现中,检查一下是否有一个顶层窗口(可以用 GetParent() 来判断)是由你刚刚启动的进程拥有的(可以用 GetWindowThreadProcessId() 来获取进程ID)。
这样你就能找到你刚启动的进程的顶层窗口。接下来,你可以调用 ShowWindow() 来显示或隐藏这个窗口。
需要注意的是,这可能会遇到一些时序问题(如果你的搜索在子进程创建窗口之前就运行了,那么搜索结果会是空的),还有可能会出现闪烁(因为你会在窗口显示后再将其隐藏)。
0
你似乎把进程和窗口这两个概念搞混了。所有的窗口都是和某个进程相关联的,但某个进程不一定会有窗口。
你写的简单批处理脚本是通过cmd.exe
这个进程来执行的。如果你习惯了双击批处理脚本时窗口的表现,可能会认为cmd.exe
总是和窗口关联,但其实并不是这样。你可以自己试试,只需在已有的命令提示符下运行cmd.exe
,它不会打开一个新窗口(而运行notepad.exe
就会打开一个新窗口)。
在Python中,进程的运行方式就像是从命令提示符中运行一样——这就是为什么你不会看到另一个窗口。
这其实并没有直接回答问题,但可能对理解这个问题会有帮助。