首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 啟動與關閉外部應用程式:WinExec、FindWindow 與 SendMessage 實戰指南

     編輯:Delphi

啟動外部程式:WinExec

WinExec 是簡單啟動可執行檔的傳統 API:


function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT; stdcall;
  • lpCmdLine:命令列字串 (含路徑與參數)
  • uCmdShow:視窗顯示狀態 (如 SW_SHOWNORMAL、SW_MINIMIZE、SW_HIDE)
  • 回傳值 > 31 表示成功,否則為錯誤碼

實作:開啟對話框選擇檔案並執行


procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: string;
begin
  if OpenDialog1.Execute then begin
    FileName := OpenDialog1.FileName;
    WinExec(PChar(FileName), SW_SHOWNORMAL);
  end;
end;

關閉外部程式:FindWindow + SendMessage

透過視窗標題尋找目標視窗控制代碼,發送 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強制結束資料遺失風險、不執行清理碼最後手段、無回應程式

最佳實踐建議

  • 啟動首選 ShellExecute 或 CreateProcess (需進程控制代碼時)。
  • 關閉優先嘗試 WM_CLOSE,失敗才考慮 TerminateProcess。
  • 使用 EnumWindows + GetWindowText 更可靠地定位目標視窗。
  • 64 位元相容:確保宣告正確的指標大小 (使用 PtrUInt/NativeUInt)。

總結

Delphi 提供多層次的外部程式控制能力。從簡單的 WinExec 到完整的 CreateProcess,以及視窗層級的 FindWindow/SendMessage,根據需求選擇適當層級的 API,能建構穩健的程式整合方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved