winapi: CreateProcess, aber das Fenster des Prozesses ausblenden?

Lesezeit: 2 Minuten

Ich verwende CreateProcess, um einen cmd.exe-Prozess zu erstellen, dem ein Parameter übergeben wird, der ausgeführt und beendet wird. Dadurch wird die Eingabeaufforderung auf dem Bildschirm angezeigt.

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

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

Was ist auch der richtige Winapi-Standardweg, um Umgebungsvariablen zu erhalten?

  • Hast du das STARTF_USESHOWWINDOW in dwFlags gesetzt?

    – scharfer Zahn

    23. April 2009 um 6:15 Uhr

Wenn es sich nur um eine Konsolen-App handelt, können Sie auch die verwenden CREATE_NO_WINDOW Flagge als Teil der CreateProcess sich nennen, z

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

Siehe auch diese Seite für Informationen über Umgebungsvariablen.

  • +1: Dies ist der richtige Weg, dies zu tun. Nützlich, wenn Sie anrufen müssen cscript aus der Sitzung 0, aber ich möchte nicht, dass eine Konsole auftaucht.

    – bald

    6. Januar 2012 um 14:58 Uhr

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

    – Alex Bagnolini

    10. Januar 2012 um 16:10 Uhr

  • So starten Sie die UI-Anwendung (win32/wpf) im versteckten Modus. Ich möchte es später zeigen, nicht zum Zeitpunkt des Starts.

    – Anil8753

    9. Juni 2015 um 11:35 Uhr

Der folgende Link hier beschreibt, wie das Fenster im Hintergrund erstellt wird:

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 sind alle in Ordnung? Ich bin mir nicht sicher, wonach Sie in dieser Hinsicht fragen.

  • Nicht schlecht, aber strcat ist unsicher und getenv kann weit mehr als 4096 Zeichen zurückgeben. wiki.sei.cmu.edu/confluence/display/c/… Verwenden Sie stattdessen strcat_s.

    – John Zabroski

    28. Oktober 2019 um 20:55 Uhr

Setzen Sie das STARTF_USESHOWWINDOW in dwFlags

von Spitzzahn

  • Bei mir funktioniert es nicht. Ich sehe immer noch ein blinkendes CMD-Fenster: ghostbin.com/paste/xr7eo (dasselbe bei Verwendung von CREATE_NEW_CONSOLE in CreateProcess)

    – Skript und Code

    4. Oktober 2017 um 16:45 Uhr


Dies ist möglicherweise ein Overkill für Ihre Anforderungen, aber Sie können die ShowWindow-API einbinden und niemals Fenster für diesen Prozess anzeigen

1401070cookie-checkwinapi: CreateProcess, aber das Fenster des Prozesses ausblenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy