WinExec 是簡單啟動可執行檔的傳統 API:
function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT; stdcall;
lpCmdLine:命令列字串 (含路徑與參數)uCmdShow:視窗顯示狀態 (如 SW_SHOWNORMAL、SW_MINIMIZE、SW_HIDE)
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: string;
begin
if OpenDialog1.Execute then begin
FileName := OpenDialog1.FileName;
WinExec(PChar(FileName), SW_SHOWNORMAL);
end;
end;
透過視窗標題尋找目標視窗控制代碼,發送 WM_CLOSE 訊息請求關閉:
procedure TForm1.Button2Click(Sender: TObject);
var
Wnd: HWND;
Title: string;
begin
Title := InputBox('提示', '請輸入應用程式視窗標題:', '');
if Title <> '' then begin
Wnd := FindWindow(nil, PChar(Title)); // 依標題尋找
if Wnd <> 0 then
SendMessage(Wnd, WM_CLOSE, 0, 0) // 發送關閉訊息
else
ShowMessage('找不到指定視窗!');
end;
end;
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| WinExec | 簡單、相容舊版 | 無法取得進程控制代碼、無法等待結束 | 簡單啟動、不需互動 |
| ShellExecute/Ex | 支援文件關聯、動詞操作、UAC 提權 | 同 WinExec,無進程控制代碼 | 開啟文件、網址、提權啟動 |
| CreateProcess | 完整控制:參數、環境、標準輸入輸出、取得進程/執行緒控制代碼 | 參數複雜 | 需監控、通訊、同步的進程 |
| FindWindow+WM_CLOSE | 優雅關閉 (讓程式處理關閉邏輯) | 依賴視窗標題/類別名,不穩定 | 有 GUI 的主視窗程式 |
| TerminateProcess | 強制結束 | 資料遺失風險、不執行清理碼 | 最後手段、無回應程式 |
EnumWindows + GetWindowText 更可靠地定位目標視窗。PtrUInt/NativeUInt)。Delphi 提供多層次的外部程式控制能力。從簡單的 WinExec 到完整的 CreateProcess,以及視窗層級的 FindWindow/SendMessage,根據需求選擇適當層級的 API,能建構穩健的程式整合方案。