2009-04-23 7 views
28

Ich benutze CreateProcess, um einen cmd.exe-Prozess zu erstellen, der einen Parameter übergeben wird, der ausgeführt wird und beendet wird, damit die Eingabeaufforderung auf dem Bildschirm aufleuchtet.winapi: CreateProcess, aber verberge das Fenster des Prozesses?

Ich versuchte dies zu vermeiden, indem ich STARTUPINFO struct wShowWindow auf SW_HIDE setzte, aber dieser Parameter scheint das aufrufende Fenster zu beeinflussen, nicht das Fenster für den Prozess, der ausgeführt wird.

Gibt es trotzdem, dass Sie createprocess verwenden können, um ein Programm zu starten, das nicht sichtbar ist?

Auch was ist der richtige winapi Standard Weg um Umgebungsvariablen zu bekommen?

+4

Haben Sie die STARTF_USESHOWWINDOW in DwFlags? – sharptooth

+0

oops Ich hatte ein kleines Problem. das hat es behoben. – Myforwik

Antwort

9

stellen Sie den STARTF_USESHOWWINDOW in dwFlags

von Sharptooth

+0

Für mich funktioniert es nicht. Ich sehe immer noch ein blinkendes CMD-Fenster: https://ghostbin.com/paste/xr7eo (dasselbe bei der Verwendung von CREATE_NEW_CONSOLE in CreateProcess) –

10

Der folgende Link here beschreibt, wie das Fenster leise erstellen:

DWORD RunSilent(char* strFunct, char* strstrParams) 
{ 
    STARTUPINFO StartupInfo; 
    PROCESS_INFORMATION ProcessInfo; 
    char Args[4096]; 
    char *pEnvCMD = NULL; 
    char *pDefaultCMD = "CMD.EXE"; 
    ULONG rc; 

    memset(&StartupInfo, 0, sizeof(StartupInfo)); 
    StartupInfo.cb = sizeof(STARTUPINFO); 
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW; 
    StartupInfo.wShowWindow = SW_HIDE; 

    Args[0] = 0; 

    pEnvCMD = getenv("COMSPEC"); 

    if(pEnvCMD){ 

     strcpy(Args, pEnvCMD); 
    } 
    else{ 
     strcpy(Args, pDefaultCMD); 
    } 

    // "/c" option - Do the command then terminate the command window 
    strcat(Args, " /c "); 
    //the application you would like to run from the command window 
    strcat(Args, strFunct); 
    strcat(Args, " "); 
    //the parameters passed to the application being run from the command window. 
    strcat(Args, strstrParams); 

    if (!CreateProcess(NULL, Args, NULL, NULL, FALSE, 
     CREATE_NEW_CONSOLE, 
     NULL, 
     NULL, 
     &StartupInfo, 
     &ProcessInfo)) 
    { 
     return GetLastError();  
    } 

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
    if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc)) 
     rc = 0; 

    CloseHandle(ProcessInfo.hThread); 
    CloseHandle(ProcessInfo.hProcess); 

    return rc; 

} 

Ich denke, getenv und setenv alles in Ordnung sind? Ich bin mir nicht sicher, worüber Sie in dieser Hinsicht fragen.

0

Dies könnte ein Overkill für Ihre Bedürfnisse, aber Sie können die Showwindow API Haken und nie zeigen alle Fenster für diesen Prozess

+5

Das ist nicht nur Overkill. Es ist Unsinn. – Elmue

46

Wenn seine nur eine Konsole app Sie auch die CREATE_NO_WINDOW Flagge als Teil des CreateProcess verwenden können sich selbst nennen, z

CreateProcess(NULL, lpszCommandLine, NULL, NULL, FALSE, 
       CREATE_NO_WINDOW, NULL, NULL, &si, &pi); 

Auch finden this page für Informationen über Umgebungsvariablen.

+0

+1: Dies ist der richtige Weg, dies zu tun. Nützlich, wenn Sie 'cscript' aus der Sitzung 0 aufrufen müssen, aber keine Konsole angezeigt werden soll. – ereOn

+2

Für zukünftige Referenzen: CREATE_NO_WINDOW hat Wert & H8000000 –

+2

Wie UI-Anwendung (Win32/WPF) im versteckten Modus gestartet werden. Ich möchte es später zeigen, nicht zum Zeitpunkt des Starts. – Anil8753