使用Delphi啟動和關(guān)閉外部應(yīng)用程序

字號:

Delphi與Windows平臺緊密結(jié)合,編譯代碼快速高效。作為一種可視化的面向?qū)ο箝_發(fā)工具,Delphi可以幫助程序員更輕松、更快速地編寫各種Windows應(yīng)用程序。而且通過編程可以方便地調(diào)用其它語言編寫的動態(tài)庫或應(yīng)用程序,并在不需要時關(guān)閉這些外部程序。這一點對許多編程人員非常有用,例如,在采用Delphi進行軟件開發(fā)的同時,可能需要調(diào)用以前采用其它工具開發(fā)的應(yīng)用程序,以免再次重新編寫代碼,或者需要調(diào)用Windows中的記事本和計算器等工具,以便在程序運行過程中記錄信息或進行計算等。
    在Delphi中,通過調(diào)用一組API函數(shù)是可以比較輕松地完成上述要求的。下面本文將以一個實際的例子詳細(xì)地介紹一下實現(xiàn)外部應(yīng)用程序啟動和關(guān)閉的具體方法和步驟:
    1. 創(chuàng)建一個應(yīng)用程序
    在應(yīng)用程序的窗體上添加兩個Tbutton組件和一個TopenDialog組件。設(shè)置其中一個Tbutton組件的Caption屬性為“啟動外部應(yīng)用程序”、另一個Tbutton組件的Caption屬性為“關(guān)閉已開啟的外部應(yīng)用程序”。設(shè)置TopenDialog組件的Filter屬性為“可執(zhí)行文件(*.exe)|*.exe”。
    2. 實現(xiàn)外部應(yīng)用程序的啟動功能
    ⑴ 要啟動外部應(yīng)用程序,可以通過調(diào)用API函數(shù)WinExec來實現(xiàn)。該函數(shù)用于運行指定的應(yīng)用程序。下面介紹一下該函數(shù)所需的參數(shù)和返回值:
    UINT WinExec(
    LPCSTR lpCmdLine, file://命令行指針
    UINT uCmdShow file://應(yīng)用程序的窗口風(fēng)格
    );
    如果成功,返回值大于31。否則可能返回下列結(jié)果:   0 系統(tǒng)內(nèi)存或資源不足
    ERROR_BAD_FORMAT 該*.EXE文件無效
    ERROR_FILE_NOT_FOUND 沒找到指定的文件
    ERROR_PATH_NOT_FOUND 沒找到指定路徑
    ⑵ 通過編寫標(biāo)題為“啟動外部應(yīng)用程序”組件的OnClick事件,來實現(xiàn)外部應(yīng)用程序的啟動,代碼如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    str: string; file://存儲指定的應(yīng)用程序文件名
    begin
    if opendialog1.Execute then file://選擇要調(diào)用的外部可執(zhí)行程序
    begin
    str := opendialog1.FileName; file://獲取可執(zhí)行文件名
    winexec(PChar(str), SW_SHOWNORMAL); file://啟動指定的可執(zhí)行程序
    end;
    end;
    3. 關(guān)閉已開啟的外部應(yīng)用程序
    ⑴ 通過調(diào)用兩個API函數(shù),可以實現(xiàn)該功能。這兩個函數(shù)分別為:
    ① FindWindow函數(shù) 該函數(shù)用于查找與指定的類名和窗口名相匹配的高層窗口,如果查找成功,返回非0值,否則返回0。
    ② SendMessage函數(shù) 此函數(shù)向一個或多個窗口發(fā)送指定的消息。在此通過發(fā)送WM_CLOSE消息來關(guān)閉指定的外部應(yīng)用程序。
    ⑵ 通過編寫標(biāo)題為“關(guān)閉已開啟的外部應(yīng)用程序”組件的OnClick事件,來關(guān)閉已開啟的外部應(yīng)用程序。代碼如下:
    procedure TForm1.Button2Click(Sender: TObject);
    var
    hWndClose: HWnd; file://存儲指定的外部應(yīng)用程序窗口句柄
    str: String; file://存儲指定的外部應(yīng)用程序的窗口名
    begin
    str := InputBox('提示','請輸入應(yīng)用程序名:',''); file://獲取要關(guān)閉的應(yīng)用程序窗口名
    if str <> '' then begin
    file://根據(jù)窗口名查找要關(guān)閉的窗口句柄
    hWndClose := FindWindow(nil, PChar(str));
    if hWndClose <> 0 then file://如果查找成功,則發(fā)送消息,關(guān)閉指定的窗口
    SendMessage(hWndClose,WM_CLOSE,0,0);
    else file://否則,給出提示信息
    ShowMessage('沒找到指定的應(yīng)用程序,所以無法關(guān)閉!');
    end;
    end;