2010-02-23 22 views
5

Was ich versuche, ist ein Skript schreiben, die eine Anwendung nur in der Prozessliste öffnen würde. Das heißt, es wäre "versteckt". Ich weiß nicht einmal, ob es in Python möglich ist.Öffnen Sie ein Programm mit Python minimiert oder versteckt

Wenn es nicht möglich ist, ich auch nur eine Funktion regeln würde, die für ein Programm mit Python vielleicht so etwas wie dies in einem minimierten Zustand geöffnet werden lassen würde:

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

Jemand schlug vor, verwenden win32com.client aber die Sache ist, dass das Programm, das ich starten möchte, keinen COM-Server unter dem Namen registriert hat.

Irgendwelche Ideen?

Antwort

6

Sie win32api verwenden sollten, und verstecken Sie Ihre Fenster z.B. mit win32gui.EnumWindows können Sie alle Top-Fenster aufzuzählen und Fenster

Hier verstecken ist ein kleines Beispiel, Sie so etwas tun kann:

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

Kennen Sie das entsprechende Modul unter Linux? – helplessKirk

0

Wenn ein Terminal angezeigt wird, leiten Sie das Stdout des Prozesses um.

+0

Es ist kein Terminal. – wtz

1

Was ist der Zweck?

Wenn Sie einen versteckten (kein Fenster) Prozess im Hintergrund arbeiten möchten, wäre der beste Weg, einen Windows-Dienst zu schreiben und ihn mit dem üblichen Fenster-Service-Mechanismus zu starten/stoppen. Windows-Dienst kann leicht in Python geschrieben werden, z.B. hier ist ein Teil meiner eigenen Service (es ohne einige Modifikationen, die nicht ausgeführt werden)

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) 

und Sie können es von

python svc_jagteraho.py--startup auto install 

und führen Sie es installieren, indem

python python svc_jagteraho.py start 

Ich werde auch in der Serviceliste z services.msc wird es zeigen, und Sie können beginnen/aufhören sonst kann man Kommandozeile verwenden

sc stop jagteraho 
+1

Ich denke, das ist übertrieben in Bezug auf was ich will. Der Zweck des Skripts besteht darin, ein Programm nur beim Starten des Skripts (ohne Fenster) auszublenden. Das Programm, das ich verstecken möchte, ist eine proprietäre Anwendung, die einige Zahlen knirscht und geschrieben wird, denke ich in C. Python verbirgt es im Grunde und holt den Fortschritt in einem sehr netten minimalistischen transparenten GUI Fenster, das ich geschrieben habe. Nichts Besonderes. Das Problem ist, dass ich nicht möchte, dass dieses riesige Fenster um meinen Desktop herum schwebt, also möchte ich es verstecken. – wtz

+0

@wtzolt, es hängt davon ab, aber für lange laufende Hintergrund-Prozess-Service ist der beste Weg, trotzdem habe ich eine andere Lösung hinzugefügt, um jede Art von Fenster zu verstecken, so sollte es mit Ihrer App zu arbeiten –

+0

@WZ vielleicht ist dies ein wenig offtopic aber da ist ein nettes kleines Tool namens "Power Menu" http://www.abstractpath.com/powermenu/ es bringt einige Funktionen eines großen * ix Desktops zu Windows zB. Minimiere auf Tray oder immer auf – enthus1ast

10

Es ist einfach :)
Python Popen Accept STARTUP Struktur ...
Über STARTUP Struktur: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx

Run Versteckt:

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

Run Minimized:

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