c - Ved hjælp af CreateProcess kan du ikke få CREATE\_NO\_WINDOW til at undertrykke konsollen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ønsker at starte en proces (vi bruger notepad til enkelhed) uden at konsolvinduet popper op.


Jeg er sikker på at jeg har savnet noget meget simpelt, her er min mest forenklede test sag:


#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void \_tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS\_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        "notepad",        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        CREATE\_NO\_WINDOW,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS\_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (\%d).
", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

Bedste reference


Du opretter en ny proces (notepad.exe) fra en forældersproces (din konsolprogram), og lad forældreprocessen vente på, at børneprocessen er færdig. Konsolvinduet er hovedvinduet i din overordnede proces. Du kan gemme og gendanne er som vist nedenfor.


// Notice how hiding the console window causes it to disappear from
// the Windows task bar. If you only want to make it minimize, use
// SW\_MINIMIZE instead of SW\_HIDE.
void \_tmain(int argc, TCHAR *argv[])
{
    ShowWindow( GetConsoleWindow(), SW\_HIDE );

    // create a new process and wait for it to finish

    ShowWindow( GetConsoleWindow(), SW\_RESTORE );
}

Andre referencer 1


Skift applikationsundersystemet fra Console til Windows. I VS2008 er dette under linkegenskaber, System.
Skift derefter din hovedfunktion til:


int APIENTRY \_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)


og skift kode for at returnere en int.

Andre referencer 2


Sådan ændrer du applikationsundersystemet fra Console til Windows ved hjælp af MinGW, tilføj disse linkerflagge:


-Wl,-subsystem,windows