2014-11-06 9 views
5

Sto utilizzando una procedura fornita che eseguirà un processo ma voglio che il processo venga eseguito in background senza che la finestra venga visualizzata. La chiamata èNascondere la finestra del processo con 'CreateProcess'

ExecProcess(ProgPath, '', False); 

e la funzione è

function ExecProcess(ProgramName, WorkDir: string; Wait: boolean): integer; 
var 
    StartInfo: TStartupInfo; 
    ProcInfo: TProcessInformation; 
    CreateOK: boolean; 
    ExitCode: integer; 
    dwExitCode: DWORD; 
begin 
    ExitCode := -1; 

    FillChar(StartInfo, SizeOf(TStartupInfo), #0); 
    FillChar(ProcInfo, SizeOf(TProcessInformation), #0); 
    StartInfo.cb := SizeOf(TStartupInfo); 

    if WorkDir <> '' then 
    begin 
    CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, Addr(WorkDir[1]), 
     false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, 
     StartInfo, ProcInfo); 
    end 
    else 
    begin 
    CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, nil, false, 
     CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, Addr(WorkDir[1]), 
     StartInfo, ProcInfo); 
    end; 

    { check to see if successful } 

    if CreateOK then 
    begin 
    // may or may not be needed. Usually wait for child processes 
    if Wait then 
    begin 
     WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
     GetExitCodeProcess(ProcInfo.hProcess, dwExitCode); 
     ExitCode := dwExitCode; 
    end; 
    end 
    else 
    begin 
    ShowMessage('Unable to run ' + ProgramName); 
    end; 

    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 

    Result := ExitCode; 

end; 

Ho provato ad utilizzare l'attributo StartInfo.wShowWindow con SW_MINIMIZE, SW_FORCEMINIMIZE e SW_SHOWMINIMIZED ma non è funzionante. Vedo che l'attributo sta cambiando nel debugger ma questo è quanto ho capito adesso. Qualcuno potrebbe indicare qual è il problema?

EDIT: Se è importante eseguo un paio di moduli Fortran (.exe) con argomenti che apriranno una finestra CMD.

+1

è l'altra console processo o GUI App? Hai problemi con vars firmati e non firmati sul codice di uscita. Il secondo parametro di CreateProcess deve essere scrivibile. Usa UniqueString per quello. –

+1

Non usare '+' per unire i flag 'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS', devi usare l'operatore' or', come 'CREATE_NEW_PROCESS_GROUP o NORMAL_PRIORITY_CLASS'. In questo caso il risultato è lo stesso, ma in molti casi non lo è. – kibab

+0

Oltre a ciò che David ha detto su 'UniqueString()', dovresti usare anche 'PChar (ProgramName)' invece di 'Addr (ProgramName [1])'. –

risposta

7

Utilizzare dwFlags con STARTF_USESHOWWINDOW forzata l'utilizzo di wShowWindow

StartInfo.wShowWindow := SW_HIDE; 
StartInfo.dwFlags := STARTF_USESHOWWINDOW; 
+0

Grazie per il tempo dedicato, @TLama mi ha appena dato la stessa soluzione. – user3464658

+0

Ups, @TLama mi dispiace di aver aperto la domanda che ho appena visto 'SW_HIDE', non ho realizzato l'aggiornamento del commento. Forse dovresti aggiungerlo come risposta e cancellerò il mio. – bummi

+1

'STARTF_USESHOWWINDOW' funziona solo per le app GUI, e anche in questo caso è solo un suggerimento, non vi è alcuna garanzia al 100% che l'app lo onorerà effettivamente, a seconda di come implementa la sua interfaccia utente. Le UI standard che usano 'ShowWindow()' lo onoreranno, comunque. Per un'app console, puoi usare il flag 'CREATE_NO_WINDOW' nel parametro' dwCreationFlags' di 'CreateProcess()'. –

Problemi correlati