2014-11-06 149 views
5

我正在使用提供給我的程序來運行一個進程,但我希望進程在後臺運行而不顯示窗口。電話是使用'CreateProcess'隱藏進程窗口

ExecProcess(ProgPath, '', False); 

而且功能

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; 

我曾嘗試使用StartInfo.wShowWindow屬性與SW_MINIMIZESW_FORCEMINIMIZESW_SHOWMINIMIZED,但它不工作。我可以看到該屬性在調試器中發生了變化,但這與我目前所瞭解的一樣。有人能指出問題是什麼嗎?

編輯:如果它很重要我正在執行一些Fortran模塊(.exe)與參數,將打開一個CMD窗口。

+1

的使用是其他程序控制臺或GUI應用程序?退出代碼中的簽名和未簽名變量有問題。 CreateProcess的第二個參數必須是可寫的。爲此使用UniqueString。 – 2014-11-06 10:12:42

+1

不要使用'+'來合併標誌'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS',你必須使用'或'運算符,比如'CREATE_NEW_PROCESS_GROUP或NORMAL_PRIORITY_CLASS'。在這種情況下,結果是一樣的,但在很多情況下,結果是一樣的。 – kibab 2014-11-06 10:37:35

+0

除了David關於'UniqueString()'的說法外,還應該使用'PChar(ProgramName)'而不是'Addr(ProgramName [1])'。 – 2014-11-06 18:13:39

回答

7

使用dwFlags中與STARTF_USESHOWWINDOW強迫的wShowWindow

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

感謝您抽出寶貴的時間,@TLama給了我相同的解決方案。 – user3464658 2014-11-06 09:38:54

+0

Ups,@TLama抱歉打開了我只能看見'SW_HIDE'的問題,我沒有意識到這個評論的更新。也許你應該添加它作爲答案,我會刪除我的。 – bummi 2014-11-06 09:41:09

+1

'STARTF_USESHOWWINDOW'只適用於GUI應用程序,即使這只是一個提示,也不能100%保證應用程序會實際遵守它,這取決於它如何實現其UI。不過,使用'ShowWindow()'的標準用戶界面將會尊重它。對於控制檯應用程序,可以使用'CreateProcess()'的'dwCreationFlags'參數中的'CREATE_NO_WINDOW'標誌。 – 2014-11-06 18:11:06