winapi: CreateProcess pero oculta la ventana del proceso?

3 minutos de lectura

Estoy usando CreateProcess para crear un proceso cmd.exe al que se le pasa un parámetro que se ejecuta y se cierra, esto hace que el símbolo del sistema parpadee en la pantalla.

Traté de evitar esto configurando STARTUPINFO struct wShowWindow en SW_HIDE, pero este parámetro parece afectar la ventana de llamada, no la ventana del proceso que se ejecuta.

¿Hay alguna forma de que pueda usar createprocess para iniciar un programa que está oculto a la vista?

Además, ¿cuál es la forma estándar adecuada de winapi para obtener variables de entorno?

  • ¿Ha configurado STARTF_USESHOWWINDOW en dwFlags?

    – diente filoso

    23 de abril de 2009 a las 6:15

Si es solo una aplicación de consola, también puede usar la CREATE_NO_WINDOW bandera como parte de la CreateProcess llamarse a sí mismo, por ejemplo

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

Ver también esta página para obtener información sobre las variables de entorno.

  • +1: Esta es la forma correcta de hacerlo. Útil cuando necesitas llamar cscript de la sesión 0 pero no quiero que aparezca ninguna consola.

    – ereOn

    6 de enero de 2012 a las 14:58

  • Para referencias futuras: CREATE_NO_WINDOW tiene valor &H8000000

    – Alex Bagnolini

    10 de enero de 2012 a las 16:10

  • Cómo iniciar la aplicación de interfaz de usuario (win32/wpf) en modo oculto. Quiero mostrarlo más tarde, no en el momento del lanzamiento.

    – Anil8753

    9 de junio de 2015 a las 11:35

el siguiente enlace aquí describe cómo crear la ventana en silencio:

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;

}

¿Creo que getenv y setenv están bien? No estoy seguro de lo que está preguntando en ese sentido.

configurar STARTF_USESHOWWINDOW en dwFlags

por diente afilado

  • Para mi no funciona. Todavía veo una ventana CMD parpadeante: ghostbin.com/paste/xr7eo (lo mismo cuando se usa CREATE_NEW_CONSOLE en CreateProcess)

    – script’n’code

    04/10/2017 a las 16:45


Esto podría ser una exageración para sus necesidades, pero puede conectar la API ShowWindow y nunca mostrar ninguna ventana para ese proceso.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad