2014-11-06 23 views
5

Tôi đang sử dụng quy trình được cung cấp cho tôi để chạy quy trình nhưng tôi muốn quy trình chạy trong nền mà không có cửa sổ hiển thị. Cuộc gọi làẨn cửa sổ quy trình với 'CreateProcess'

ExecProcess(ProgPath, '', False); 

và chức năng là

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; 

tôi đã cố gắng sử dụng thuộc tính StartInfo.wShowWindow với SW_MINIMIZE, SW_FORCEMINIMIZESW_SHOWMINIMIZED nhưng nó không được làm việc. Tôi có thể thấy rằng thuộc tính đang thay đổi trong trình gỡ rối nhưng đó là nhiều như tôi hiểu ngay bây giờ. Ai đó có thể chỉ ra vấn đề là gì?

EDIT: Nếu vấn đề tôi thực hiện một vài mô-đun Fortran (.exe) với các đối số sẽ mở ra một cửa sổ CMD.

+1

là quá trình điều khiển hoặc GUI ứng dụng khác? Bạn có vấn đề với các ký hiệu đã ký và chưa ký trên mã thoát. Tham số thứ hai của CreateProcess phải được ghi. Sử dụng UniqueString cho điều đó. –

+1

Không sử dụng '+' để hợp nhất cờ 'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS', bạn phải sử dụng toán tử' hoặc', như 'CREATE_NEW_PROCESS_GROUP hoặc NORMAL_PRIORITY_CLASS'. Trong trường hợp này kết quả là như nhau, nhưng trong nhiều trường hợp nó sẽ không. – kibab

+0

Ngoài những gì David đã nói về 'UniqueString()', bạn cũng nên sử dụng 'PChar (ProgramName)' thay vì 'Addr (ProgramName [1])'. –

Trả lời

7

Sử dụng dwFlags với STARTF_USESHOWWINDOW để buộc việc sử dụng wShowWindow

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

Cảm ơn bạn đã dành thời gian, @TLama vừa cho tôi giải pháp tương tự. – user3464658

+0

Ups, @TLama xin lỗi vì đã mở câu hỏi tôi chỉ có thể thấy 'SW_HIDE', tôi không nhận ra bản cập nhật của nhận xét. Có lẽ bạn nên thêm nó như là câu trả lời và tôi sẽ xóa của tôi. – bummi

+1

'STARTF_USESHOWWINDOW' chỉ hoạt động cho các ứng dụng GUI, và thậm chí sau đó nó chỉ là một gợi ý, không có đảm bảo 100% ứng dụng sẽ thực sự tôn vinh nó, tùy thuộc vào cách nó thực hiện giao diện người dùng của nó. Giao diện người dùng chuẩn sử dụng 'ShowWindow()' sẽ tôn trọng nó. Đối với ứng dụng bảng điều khiển, bạn có thể sử dụng cờ 'CREATE_NO_WINDOW' trong tham số' dwCreationFlags' của 'CreateProcess()'. –

Các vấn đề liên quan