在逛淘寶或者使用QQ相關的產品的時候,比如淘寶我要聯絡店家點選旺旺圖示的時候能夠自動啟動阿里旺旺進行聊天。之前很奇怪為什麼網頁端能夠自動啟動客戶端程式,最近在開發吉特倉儲管理系統的時候也遇到一個類似的問題,因為使用網頁端的列印效果並不是太好,之前也寫過關於列印相關的文章可以查閱,我需要使用WinForm客戶端來驅動列印,但是我又不想重新開發Winform客戶端的所有功能,只要能夠使用winform驅動列印即可。我就需要一個類似阿里旺旺一樣的功能,點選網頁上的按鈕啟動WinForm程式,並且傳遞一定的引數。
一. 註冊協議
在網上查閱相關資料,要在網頁中啟動相關的Winform程式,可以使用登錄檔自定義協議來完成,一下是完成的步驟:
(1) 在命令列(cmd)輸入regedit 可以開啟登錄檔的預覽窗體
(2) 自定義協議的名稱為gitwms,名字可以隨意,儘量取的有意義
(3) 在登錄檔 HKEY_CLASSES_ROOT 下新增項項: 右鍵選擇該節點,新建-項-在樹節點中輸入協議名稱 gitwms
(4) 選中gitwms節點,在右側列表框中雙擊預設項,在數值資料輸入框中輸入 “URL:自定義協議” , 網上說可以隨意些,沒有測試,輸入此值測試成功
(4) 然後在列表中右鍵 新建 字串值, 在名稱欄輸入 "URL Protocol", 然後雙擊該項在資料這一欄輸入 "URL Protocol" , 資料欄資料隨意
(5) 在gitwms 節點下新建項: "shell"
(6) 在"shell" 項下新建項:"open"
(7) 在"open"項下新建項:"command"
(8) 選中command項,右側列表中雙擊預設這一行,在資料數值這一項中輸入 "D:\Print.exe" "%1" , 注意這裡的 引號是要的,前面是程式的絕對路徑,後面暫且固定吧【還未完全弄懂】
二. 網頁測試
在記事本中編輯 <a href="gitwms:441">點選這裡啟動程式</a> 內容, 然後另存為網頁格式,使用瀏覽器開啟。
點選網頁上的連線,會出現如上對話方塊。和啟動阿里旺旺的比較類似了,應該說離成功不遠了。點選按鈕啟動應用 就可以啟動客戶端程式了
登錄檔新增之後的結構如上圖
三. 難道每次都手工新增登錄檔
上面登錄檔的操作都是使用手工處理的,這樣在安裝程式的時候多麻煩, 要是能夠實現使用程式註冊登錄檔,那就省事多了。 這個在很多程式中都有這樣的功能,使用.NET也可以很方便的操作登錄檔。 登錄檔分為幾個節點,登錄檔開頭分支,也叫根分支,分別是:HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIG。
(1)使用RegistryKey的OpenSubKey()方法開啟登錄檔
(2)使用RegistryKey的CreateSubKey()方法新建登錄檔
(3)使用RegistryKey的DeleteSubKey()方法刪除登錄檔
(4)使用SetValue()方法設定/建立登錄檔鍵值
在使用的時候需要先檢查登錄檔是否存在,如果存在刪除原有的註冊情況,然後新增註冊資訊。
try { Console.WriteLine("正在查詢已經註冊的程式....."); RegistryKey key = Registry.ClassesRoot; key.DeleteSubKeyTree(@"gitwms"); Console.WriteLine("已經清除註冊程式....."); } catch (Exception e) { Console.WriteLine("未找到註冊的程式..."); } /*===============================================*/ Console.WriteLine("開始註冊程式...."); RegistryKey regWrite = Registry.ClassesRoot.CreateSubKey("gitwms"); regWrite.SetValue("", "URL:自定義協議"); regWrite.SetValue("URL Protocol", "URL Protocol"); regWrite.Close(); regWrite = Registry.ClassesRoot.CreateSubKey(@"gitwms\shell"); regWrite.Close(); regWrite = Registry.ClassesRoot.CreateSubKey(@"gitwms\shell\open"); regWrite.Close(); regWrite = Registry.ClassesRoot.OpenSubKey(@"gitwms\shell\open", true); RegistryKey aimdir = regWrite.CreateSubKey("command"); string BaseDirectory=AppDomain.CurrentDomain.BaseDirectory; string AppPath = Path.Combine(BaseDirectory, "OWorld.Cloud.Resource.Download.exe"); aimdir.SetValue(@"", "\""+AppPath+"\" \" %1\""); regWrite.Close(); aimdir.Close();
使用以上程式碼可以輕鬆的實現註冊的寫入, 並且完全滿足剛才自定義協議的規則。 這裡我們將註冊的程式做成一個register.exe 程式, 放到要啟動的客戶端程式根目錄下, 在使用前使用管理員身份執行註冊程式,便於獲取啟動程式的根路徑寫入到登錄檔。
這裡有一個地方是值得注意的,新建登錄檔之後就會出現一項 (預設) 的鍵值資料, 剛開始無論怎樣都不能往這個項中寫入資料, 是自己沒有弄明白的,這裡是一個坑。 在使用SetValue() 賦值的時候,需要將Key 設定為 "", 不然不能往(預設)這一項中寫入值。
四. 如何傳遞引數
啟動了客戶端程式這遠遠還不夠,如何能夠將網頁上的引數傳遞到客戶端程式中。
static void Main(string[] args)
關鍵點就在這裡, 主程式進入之後,使用引數陣列 args 接收外來引數。
<a href="gitwms:441">點選這裡啟動程式</a>
點選這個連線會將引數 gitwms:441 全部傳入到args中, gitwms:**** 後可以跟任意的引數, 包括JSON字串。 這樣就方便多了,獲取引數之後就可以做相應的操作
以上程式操作是為了啟動客戶端的列印而做的,這裡不一定做的很好,但是也不失為一種辦法。
作者:情緣
出處:http://www.cnblogs.com/qingyuan/
關於作者:從事倉庫,生產軟體方面的開發,在專案管理以及企業經營方面尋求發展之路
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
聯絡方式: 個人QQ 821865130 ; 倉儲技術QQ群 88718955,142050808 ;
吉特倉儲管理系統 開源地址: https://github.com/hechenqingyuan/gitwms