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