2010-02-23 100 views
5

Lo que intento hacer es escribir un script que abra una aplicación solo en la lista de procesos. Lo que significa que sería "oculto". Ni siquiera sé si es posible en Python.Abrir un programa con python minimizado u oculto

Si no es posible, me conformaría incluso una función que permita que un programa se abrió con el pitón en un estado minimizado tal vez algo como esto:

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

Alguien sugirió utilizar win32com.client pero el problema es que el programa que deseo iniciar no tiene un servidor COM registrado bajo el nombre.

¿Alguna idea?

Respuesta

6

Debe utilizar win32api y ocultar la ventana, por ejemplo, utilizando win32gui.EnumWindows puede enumerar todas las ventanas superiores y ocultar la ventana

Aquí está un pequeño ejemplo, puede hacer algo como esto:

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." 
+0

¿Conoce el módulo correspondiente en Linux? – helplessKirk

0

Si lo que aparece es un terminal, redirija la salida estándar del proceso.

+0

No es un terminal. – wtz

1

¿Cuál es el propósito?

si desea un proceso oculto (sin ventana) que funcione en segundo plano, la mejor manera sería escribir un servicio de Windows y comenzar/detenerlo utilizando el mecanismo de servicio de ventana habitual. El servicio de Windows se puede escribir fácilmente en python, p. He aquí parte de mi propio servicio (no se ejecutará sin algunas modificaciones)

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 e.g. 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) 

y se puede instalar por

python svc_jagteraho.py--startup auto install 

y ejecutarlo por

python python svc_jagteraho.py start 

seré también se puede ver en la lista de servicios, por ejemplo services.msc lo mostrará y se puede iniciar/detener cosa que se pueda utilizar comandos

sc stop jagteraho 
+1

Creo que esto es exagerado en términos de lo que quiero. El propósito de la secuencia de comandos es ejecutar un programa oculto (sin ventana) solo cuando inicia la secuencia de comandos. El programa que quiero ocultar es una aplicación patentada que realiza algunos cálculos numéricos y está escrito, creo que en C. Python básicamente lo oculta y recupera el progreso en una ventana de interfaz gráfica de usuario muy minimalista y transparente que escribí. Nada mayor. El problema es que no quiero que esta gran ventana esté flotando alrededor de mi escritorio, así que quiero ocultarlo. – wtz

+0

@wtzolt, depende, pero durante mucho tiempo el servicio de proceso en segundo plano es la mejor manera, de todas formas agregué otra solución para ocultar cualquier tipo de ventana, por lo que debería funcionar también con tu aplicación –

+0

@wtz tal vez esto sea un poco oftálico pero hay es una pequeña herramienta ordenada llamada "Power Menu" http://www.abstractpath.com/powermenu/ que trae algunas características de un escritorio * ix importante a Windows, por ejemplo. Minimice a la bandeja o siempre en la parte superior – enthus1ast

10

Es fácil :)
Python Popen Aceptar Estructura STARTUPINFO ...
Sobre STARTUPINFO Estructura: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx

Ejecutar Ocultos:

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() 

Ejecutar minimizado:

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() 
Cuestiones relacionadas