2009-04-23 6 views
28

Używam CreateProcess do utworzenia procesu cmd.exe, który jest przekazywany do parametru, który wykonuje i kończy, powoduje to, że wiersz poleceń miga na ekranie.winapi: CreateProcess, ale ukryć okno procesu?

Próbowałem tego uniknąć, ustawiając STARTUPINFO struct wShowWindow na SW_HIDE, ale ten parametr wydaje się wpływać na okno wywołujące, a nie okno procesu, który zostanie wykonany.

Czy istnieje możliwość użycia programu createprocess do uruchomienia ukrytego programu?

Co jest właściwym standardem Winapi do uzyskania zmiennych środowiskowych?

+4

Czy ustawiłeś STARTF_USESHOWWINDOW w dwFlags? – sharptooth

+0

oops Miałem problem z ustawionym bitem. to naprawiło. – Myforwik

Odpowiedz

9

ustawić STARTF_USESHOWWINDOW w dwFlags

przez Sharptooth

+0

Dla mnie to nie działa. Nadal widzę migające okno CMD: https://ghostbin.com/paste/xr7eo (to samo przy użyciu CREATE_NEW_CONSOLE w CreateProcess) –

10

Poniższy link here opisuje jak stworzyć okno cicho:

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; 

} 

myślę getenv i setenv są w porządku? Nie jestem pewien, o co pytasz w tym względzie.

0

To może być przesadą do swoich potrzeb, ale można podłączyć API ShowWindow i nie wykazują żadnych okien dla tego procesu

+5

To nie jest tylko przesada. To nonsens. – Elmue

46

Jeśli jej tylko aplikacja konsoli można również użyć flagi CREATE_NO_WINDOW jako część CreateProcess zadzwoń sam, np

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

Zobacz także this page, aby uzyskać informacje o zmiennych środowiskowych.

+0

+1: To jest właściwy sposób, aby to zrobić. Przydatne, gdy musisz wywoływać 'cscript' z sesji 0, ale nie chcesz, aby pojawiała się jakaś konsola. – ereOn

+2

Dla przyszłych odniesień: CREATE_NO_WINDOW ma wartość i H8000000 –

+2

Jak uruchomić aplikację UI (win32/wpf) w trybie ukrytym. Chcę to pokazać później, nie w momencie premiery. – Anil8753