用Python最小化或隐藏打开一个程序

我想要做的是编写一个脚本,只能在进程列表中打开一个应用程序。 这意味着它将被“隐藏”。 我甚至不知道它是否可能在python中。

如果不可能的话,我甚至可以解决一个函数,这个函数可以用python以最小化的状态打开一个程序,例如:

import subprocess def startProgram(): subprocess.Hide(subprocess.Popen('C:\test.exe')) # I know this is wrong but you get the idea... startProgram() 

有人build议使用win32com.client,但事情是,我想要启动的程序没有注册名称下的COM服务器。

有任何想法吗?

你应该使用win32api和隐藏你的窗口,例如使用win32gui.EnumWindows你可以枚举所有的顶部窗口,并隐藏你的窗口

这是一个小例子,你可以这样做:

 import subprocess import win32gui import time proc = subprocess.Popen(["notepad.exe"]) # lets wait a bit to app to start time.sleep(3) def enumWindowFunc(hwnd, windowList): """ win32gui.EnumWindows() callback """ text = win32gui.GetWindowText(hwnd) className = win32gui.GetClassName(hwnd) #print hwnd, text, className if text.find("Notepad") >= 0: windowList.append((hwnd, text, className)) myWindows = [] # enumerate thru all top windows and get windows which are ours win32gui.EnumWindows(enumWindowFunc, myWindows) # now hide my windows, we can actually check process info from GetWindowThreadProcessId # http://msdn.microsoft.com/en-us/library/ms633522(VS.85).aspx for hwnd, text, className in myWindows: win32gui.ShowWindow(hwnd, False) # as our notepad is now hidden # you will have to kill notepad in taskmanager to get past next line proc.wait() print "finished." 

这很容易 :)
Python Popen接受STARTUPINFO结构…
关于STARTUPINFO结构: https ://msdn.microsoft.com/en-us/library/windows/desktop/ms686331( v= vs.85).aspx

运行隐藏:

 import subprocess def startProgram(): SW_HIDE = 0 info = subprocess.STARTUPINFO() info.dwFlags = subprocess.STARTF_USESHOWWINDOW info.wShowWindow = SW_HIDE subprocess.Popen(r'C:\test.exe', startupinfo=info) startProgram() 

运行最小化:

 import subprocess def startProgram(): SW_MINIMIZE = 6 info = subprocess.STARTUPINFO() info.dwFlags = subprocess.STARTF_USESHOWWINDOW info.wShowWindow = SW_MINIMIZE subprocess.Popen(r'C:\test.exe', startupinfo=info) startProgram() 

如果出现的是终端,则重定向进程的stdout。

什么目的?

如果你想要一个隐藏的(无窗口)进程在后台工作,最好的方法是编写一个Windows服务,并使用通常的窗口服务机制来启动/停止它。 Windows服务可以很容易地写在Python中,例如这里是我自己的服务的一部分(它不会运行没有一些修改)

 import os import time import traceback import pythoncom import win32serviceutil import win32service import win32event import servicemanager import jagteraho class JagteRahoService (win32serviceutil.ServiceFramework): _svc_name_ = "JagteRaho" _svc_display_name_ = "JagteRaho (KeepAlive) Service" _svc_description_ = "Used for keeping important services eg broadband connection up" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.stop = False def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.log('stopping') self.stop = True def log(self, msg): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,msg)) def SvcDoRun(self): self.log('folder %s'%os.getcwd()) self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.start() def shouldStop(self): return self.stop def start(self): try: configFile = os.path.join(jagteraho.getAppFolder(), "jagteraho.cfg") jagteraho.start_config(configFile, self.shouldStop) except Exception,e: self.log(" stopped due to eror %s [%s]" % (e, traceback.format_exc())) self.ReportServiceStatus(win32service.SERVICE_STOPPED) if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppserverSvc) 

你可以通过安装它

 python svc_jagteraho.py--startup auto install 

并运行它

 python python svc_jagteraho.py start 

我也将在服务列表中看到,例如services.msc将显示它,你可以启动/停止它,否则你可以使用命令行

 sc stop jagteraho