Popen() 调用时 CMD 窗口最小化?

1 投票
3 回答
3786 浏览
提问于 2025-04-16 11:01

我正在用 Popen() 启动一个 Windows 应用程序,但会弹出一个 Windows CMD 控制台。我需要监控这个控制台的标准输入和输出。有没有办法让这个 CMD 窗口立刻最小化?这个控制台窗口干扰了我用 Popen() 启动的应用程序,因为它挡住了桌面。

我在使用 Windows XP 32 位和 Python 2.6。

谢谢!

3 个回答

0

下面的内容会根据新创建的应用程序的进程ID(pid)来最小化这个应用程序。

这个回答是基于 这个链接这个链接 的。

import win32process
import win32gui
import win32con
import time


def minimize_cb(handle, pid):
    ''' Call back function used by minimize'''
    __, processId = win32process.GetWindowThreadProcessId(handle)
    if processId == pid:
        win32gui.ShowWindow(handle, win32con.SW_MINIMIZE)


def minimize(pid):
    '''Minimize window'''
    try:
        win32gui.EnumWindows(minimize_cb, pid)
    except Exception as e:
        print('minimize failed', e)


proc = subprocess.Popen(...)
# you may need to wait a little before the window is created
# sorry I don't have a better method...
time.sleep(1)
minimize(proc.pid)
0

你是不是把你的Python文件的后缀改成了.pyw?用.pyw后,Python解释器就不会显示窗口控制台了。关于标准输出和标准输入,你可以使用subprocess.PIPE来处理。

import subprocess
cmd = subprocess.Popen('program.exe', shell=true,
                        stdout=subprocess.PIPE, stdin=subprocess.PIPE)
 #read stdout
 print cmd.stdout.read()
 #write stdin
 cmd.stdin.write('DATA')

或者你可以使用 Popen.communicate,具体可以参考这个链接:http://docs.python.org/library/subprocess.html#popen-objects

2

如果命令提示符(CMD)窗口有一个明确的标题,你可以获取它的句柄,然后用下面的代码把它最小化(在进程启动后立即执行):

import win32gui
handle = win32gui.FindWindow(None, cmd_window_title)
win32gui.ShowWindow(handle, 6)

这里的6代表的是 SW_MINIMIZE(你可以查看 MSDN关于ShowWindow()函数的文档

当然,你还应该添加一些适当的检查,比如等待窗口出现等等。

撰写回答