類似問題:實現一個類似迅雷下載的功能,使用者點擊下載連結,如果使用者未安裝迅雷,則彈出迅雷安裝對話方塊,已經安裝迅雷,則要求啟動迅雷,並下載使用者想要的種子。
核心實現:最近開發用戶端程式,被要求實現一個自訂的IE地址欄協議,目的是為了通過在IE地址欄中輸入一串符合規則的命令,可以達到和用戶端程式通訊的效果。自己思索良久,並在網上查閱相關資料,發現皆是拷貝,而且內容表述很亂,所以想在這裡寫一篇隨筆,以備其他童鞋查閱用,如有異議隨便拍磚~~哈哈
我這裡實現的功能,主要是為了以後方便使用者通過郵件,IE地址串連等方式可以方便的與用戶端程式進行通訊。
要實現IE自訂地址協議,首先應該要在註冊表裡將協議定義好。如下:
找到註冊表裡面的HKEY_CLASSES_ROOT項,在裡面建立一個 項,我這裡取名iDesk,這個項,就是協議的入口,接下來:
按照格式建項,其中command中資料的值是啟動程式入口地址, 這點很重要,這個是你要與之通訊的那個程式的安裝地址,那麼下面我來貼上實現上述功能的代碼:
/// <summary>
/// 建立註冊表值
/// </summary>
/// <param name="value">程式路徑</param>
public static void CreateRegeStartKey(string value)
{
try
{
RegistryKey key = Registry.ClassesRoot;
RegistryKey iDesk = key.CreateSubKey("iDesk");
iDesk.SetValue("", "Url protocol");
iDesk.SetValue("Url protocol", value);
RegistryKey DefaultIcon = key.CreateSubKey("iDesk\\DefaultIcon");
DefaultIcon.SetValue("", value + ",0");
RegistryKey command = key.CreateSubKey("iDesk\\shell\\open\\command");
command.SetValue("", string.Format("\"{0}\",\"%1\"", value));
}
catch (Exception ex)
{
ExceptionHandler.CreateExceptionLog(ex);
}
}
有了註冊表的這些項,那麼下面與用戶端程式通訊就比較容易了,這些項要你在安裝用戶端的時候寫進註冊表的,你要是不想360彈出阻止視窗的話,最好給應用程式簽一下名。
我們在IE地址欄中輸入iDesk://www.baidu.com ,這個時候IE瀏覽器將會尋找你在上面所設定的應用程式地址,並給應用程式傳去訊息,訊息格式為:“,iDesk://www.baidu.com”,引號裡面的內容是訊息內容,當然,如果安全性較高的話,你可以給訊息加密。
那麼用戶端如何接收訊息呢,我想這個就比較簡單了,這個要從入口函數的數組裡面找,即從static void Main(string[] args)的args[]數組裡面取,取出來將協議解析一下,任務就OK了。
結束語:實現上面的功能這樣看其實很簡單,當然還有很多後續的工作等待我們去處理,但是把複雜的問題細化之後,然後各個擊破,其實問題也就變得簡單了。就像開頭的問題一樣,去實現一個迅雷下載功能類似,使用者開啟網址想要下載一個東西,點選連結地址,這個時候使用者如果未安裝迅雷,瀏覽器將會彈出迅雷下載的視窗,讓使用者下載迅雷(一個activeX控制項實現,判斷使用者有無安裝迅雷),否則通過協議開啟迅雷,並給迅雷程式傳去下載種子的連結地址,等待使用者點擊確定下載。讀懂這篇隨筆之後,實現這個功能,豈不是很簡單!