越來越多的程式員喜歡在自己編寫的程式中加上網站或電子信箱的連結。使用者只需點擊滑鼠,即可自動開啟瀏覽器並連結到指定的URL地址,或是開啟郵件客戶程式的“建立視窗”,甚至連收件者、郵件主題、郵件內文都可以替使用者填好。
如果希望使用者能夠從網站下載升級、補丁程式,或向使用者介紹產品的最新情況,那麼可以在程式中加上到網站的連結,這無疑比讓使用者自己開啟瀏覽器,再輸入網址要便捷得多,也更能激發使用者的興趣。如果再在程式中加上電子信箱的連結,那麼使用者就可以直接給程式研製者發信,這不但可以為使用者提供更好的支援人員和售後服務,而且也便於開展使用者調查之類的活動。
本文以Delphi為例,介紹這種使用者可以直接從應用程式中連結到指定網站或寄送電子郵件的做法的工作原理及實現方法。
工作原理
很多程式員都知道Windows API函數ShellExecute可以用來執行程式、開啟檔案或檔案夾,但用該函數瀏覽URL地址或發送新郵件,恐怕瞭解者就不是很多了。因為Windows協助文檔WIN32.HLP中沒有提到這種用法。
1.標準用法
ShellExecute函數原型及參數含義如下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
●hWnd:用於指定父視窗控制代碼。當函數調用過程出現錯誤時,它將作為Windows訊息視窗的父視窗。例如,可以將其設定為應用程式主視窗控制代碼,即Application.Handle,也可以將其設定為桌面視窗控制代碼(用GetDesktopWindow函數獲得)。
●Operation:用於指定要進行的操作。其中“open”動作表示執行由FileName參數指定的程式,或開啟由FileName參數指定的檔案或檔案夾;“print”動作表示列印由FileName參數指定的檔案;“explore”動作表示瀏覽由FileName參數指定的檔案夾。當參數設為nil時,表示執行預設操作“open”。
●FileName:用於指定要開啟的檔案名稱、要執行的程式檔案名稱或要瀏覽的檔案夾名。
●Parameters:若FileName參數是一個可執行程式,則此參數指定命令列參數,否則此參數應為nil或PChar(0)。
●Directory:用於指定預設目錄。
●ShowCmd:若FileName參數是一個可執行程式,則此參數指定程式視窗的初始顯示方式,否則此參數應設定為0。
若ShellExecute函數調用成功,則傳回值為被執行程式的執行個體控制代碼。若傳回值小於32,則表示出現錯誤。
上述僅僅是ShellExecute函數的標準用法,下面將介紹它的特殊用法。
2.特殊用法
如果將FileName參數設定為“http:”協議格式,那麼該函數將開啟預設瀏覽器並連結到指定的URL地址。若使用者機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT註冊表中http協議處理程式(Protocols Handler)的設定確定啟動哪個瀏覽器。
格式一:http://網站網域名稱。
如:ShellExecute(handle, ‘open’, ‘http://
www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);
格式二:http://網站網域名稱/網頁檔案名稱。
如:ShellExecute(handle, ‘open’, ‘http://
www.neu.edu.cn/default.htm’,nil,nil,
SW_SHOWNORMAL);
如果將FileName參數設定為“mailto:”協議格式,那麼該函數將啟動預設郵件客戶程式,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若使用者機器中安裝了多個郵件客戶程式,則該函數將根據Windows 9x/NT註冊表中mailto協議處理程式的設定確定啟動哪個郵件客戶程式。
格式一:mailto:
如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗。
格式二:mailto:使用者帳號@郵件伺服器地址
如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗,並自動填入收件者地址。若指定多個收件者地址,則收件者地址之間必須用分號或逗號分隔開(下同)。
格式三:mailto:使用者帳號@郵件伺服器地址?subject=郵件主題&body=郵件內文
如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);開啟新郵件視窗,並自動填入收件者地址、郵件主題和郵件內文。若郵件內文包括多行文本,則必須在每行文本之間加入換行逸出字元%0a。
實現方法
建立一個Delphi工程,並在主表單中加入兩個標籤控制項HTTPLabel和MailToLabel。將標籤控制項的Font.Color屬性設定為clBlue,Font.Style屬性設定為空白,Cursor屬性設定為crHandPoint,Caption屬性分別設定為“歡迎惠顧我們的網站”和“給我們寫信”。
為類比超連結效果,首先,在標籤控制項的MouseMove事件中將標籤控制項的Font.Color屬性設定為clRed,Style屬性設定為fsUnderline。
procedure TForm1.HTTPLabelMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
HTTPLabel.Font.Color := clRed;
HTTPLabel.Font.Style := [fsUnderline];
end;
procedure TForm1.MailToLabelMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
begin
MailToLabel.Font.Color := clRed;
MailToLabel.Font.Style := [fsUnderline];
end;
然後,在主表單的MouseMove事件中將標籤控制項的Font.Color屬性設定為clBlue,Font.Style屬性設定為空白,以便滑鼠離開標籤控制項時標籤控制項能夠恢複原始顯示狀態。
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
HTTPLabel.Font.Color := clBlue;
HTTPLabel.Font.Style := [];
MailToLabel.Font.Color := clBlue;
MailToLabel.Font.Style := [];
end;
最後,分別在兩個標籤控制項的OnClick事件中加入網站連結或者發送郵件的程式代碼即可。
procedure TForm1.HTTPLabelClick(Sender: TObject);
begin
if ShellExecute(Handle,
‘open’,
‘http://www.neu.edu.cn’,
nil,
nil,
SW_SHOWNORMAL) <= 32 then
ShowMessage(‘發生網路錯誤!’);
end;
procedure TForm1.MailToLabelClick(Sender: TObject);
begin
if ShellExecute(Handle,
‘open’,
‘mailto:who@mail.neu.edu.cn’,
nil,
nil,
SW_SHOWNORMAL) <= 32 then
ShowMessage(‘發生郵遞錯誤!’);
end;
注意:由於ShellExecute函數是在shellapi.pas單元中聲明的,因此必須加入對shellapi.pas單元的引用:
uses
ShellAPI;
當然,讀者還可以自行嘗試將其製作成超連結控制項以便使用。
本文轉自:http://www.programbbs.com/doc/2094.htm