2009-04-23 11 views
28

Estoy usando CreateProcess para crear un proceso cmd.exe que se pasa un parámetro que se ejecuta y se cierra, esto hace que el símbolo del sistema aparezca en la pantalla.winapi: ¿CreateProcess pero oculta la ventana del proceso?

Intenté evitar esto estableciendo 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?

¿Cuál es la forma estándar correcta de winapi para obtener variables de entorno?

+4

¿Ha establecido STARTF_USESHOWWINDOW en dwFlags? – sharptooth

+0

Vaya, tuve un pequeño problema. eso lo solucionó – Myforwik

Respuesta

9

establecer el STARTF_USESHOWWINDOW en dwFlags

por sharptooth

+0

Para mí no funciona. Aún veo una ventana de CMD parpadeante: https://ghostbin.com/paste/xr7eo (lo mismo cuando se usa CREATE_NEW_CONSOLE en CreateProcess) –

10

El siguiente enlace here 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 getenv y setenv están todos de acuerdo? No estoy seguro de lo que está preguntando al respecto.

0

Esto podría ser una exageración para sus necesidades, pero se puede conectar a la API ShowWindow y nunca mostrar todas las ventanas para que el proceso de

+5

Esto no solo es excesivo. Esto no tiene sentido. – Elmue

46

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

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

Además, vea this page para obtener información sobre las variables de entorno.

+0

+1: esta es la forma correcta de hacerlo. Útil cuando necesitas llamar a 'cscript' desde la sesión 0 pero no quieres que aparezca ninguna consola. – ereOn

+2

Para referencias futuras: CREATE_NO_WINDOW tiene valor & H8000000 –

+2

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

Cuestiones relacionadas