在逛淘寶或者使用QQ相關(guān)的產(chǎn)品的時候,比如淘寶我要聯(lián)系店家點擊旺旺圖標的時候能夠自動啟動阿里旺旺進行聊天。之前很奇怪為什么網(wǎng)頁端能夠自動啟動客戶端程序,最近在開發(fā)吉特倉儲管理系統(tǒng)的時候也遇到一個類似的問題,因為使用網(wǎng)頁端的打印效果并不是太好,之前也寫過關(guān)于打印相關(guān)的文章可以查閱,我需要使用WinForm客戶端來驅(qū)動打印,但是我又不想重新開發(fā)Winform客戶端的所有功能,只要能夠使用winform驅(qū)動打印即可。我就需要一個類似阿里旺旺一樣的功能,點擊網(wǎng)頁上的按鈕啟動WinForm程序,并且傳遞一定的參數(shù)。
一. 注冊協(xié)議
在網(wǎng)上查閱相關(guān)資料,要在網(wǎng)頁中啟動相關(guān)的Winform程序,可以使用注冊表自定義協(xié)議來完成,一下是完成的步驟:
(1) 在命令行(cmd)輸入regedit 可以打開注冊表的預(yù)覽窗體
(2) 自定義協(xié)議的名稱為gitwms,名字可以隨意,盡量取的有意義
(3) 在注冊表 HKEY_CLASSES_ROOT 下添加項項: 右鍵選擇該節(jié)點,新建-項-在樹節(jié)點中輸入?yún)f(xié)議名稱 gitwms
(4) 選中g(shù)itwms節(jié)點,在右側(cè)列表框中雙擊默認項,在數(shù)值數(shù)據(jù)輸入框中輸入 “URL:自定義協(xié)議” , 網(wǎng)上說可以隨意些,沒有測試,輸入此值測試成功
(4) 然后在列表中右鍵 新建 字符串值, 在名稱欄輸入 "URL Protocol", 然后雙擊該項在數(shù)據(jù)這一欄輸入 "URL Protocol" , 數(shù)據(jù)欄數(shù)據(jù)隨意
(5) 在gitwms 節(jié)點下新建項: "shell"
(6) 在"shell" 項下新建項:"open"
(7) 在"open"項下新建項:"command"
(8) 選中command項,右側(cè)列表中雙擊默認這一行,在數(shù)據(jù)數(shù)值這一項中輸入 "D:\Print.exe" "%1" , 注意這里的 引號是要的,前面是程序的絕對路徑,后面暫且固定吧【還未完全弄懂】
二. 網(wǎng)頁測試
在記事本中編輯 <a href="gitwms:441">點擊這里啟動程序</a> 內(nèi)容, 然后另存為網(wǎng)頁格式,使用瀏覽器打開。

點擊網(wǎng)頁上的連接,會出現(xiàn)如上對話框。和啟動阿里旺旺的比較類似了,應(yīng)該說離成功不遠了。點擊按鈕啟動應(yīng)用 就可以啟動客戶端程序了

注冊表添加之后的結(jié)構(gòu)如上圖
三. 難道每次都手工添加注冊表
上面注冊表的操作都是使用手工處理的,這樣在安裝程序的時候多麻煩, 要是能夠?qū)崿F(xiàn)使用程序注冊注冊表,那就省事多了。這個在很多程序中都有這樣的功能,使用.NET也可以很方便的操作注冊表。注冊表分為幾個節(jié)點,注冊表開頭分支,也叫根分支,分別是: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()方法設(shè)置/創(chuàng)建注冊表鍵值
在使用的時候需要先檢查注冊表是否存在,如果存在刪除原有的注冊情況,然后新增注冊信息。
try
{
Console.WriteLine("正在查找已經(jīng)注冊的程序.....");
RegistryKey key = Registry.ClassesRoot;
key.DeleteSubKeyTree(@"gitwms");
Console.WriteLine("已經(jīng)清除注冊程序.....");
}
catch (Exception e)
{
Console.WriteLine("未找到注冊的程序...");
}
/*===============================================*/
Console.WriteLine("開始注冊程序....");
RegistryKey regWrite = Registry.ClassesRoot.CreateSubKey("gitwms");
regWrite.SetValue("", "URL:自定義協(xié)議");
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();
使用以上代碼可以輕松的實現(xiàn)注冊的寫入, 并且完全滿足剛才自定義協(xié)議的規(guī)則。這里我們將注冊的程序做成一個register.exe 程序, 放到要啟動的客戶端程序根目錄下, 在使用前使用管理員身份運行注冊程序,便于獲取啟動程序的根路徑寫入到注冊表。
這里有一個地方是值得注意的,新建注冊表之后就會出現(xiàn)一項 (默認) 的鍵值數(shù)據(jù), 剛開始無論怎樣都不能往這個項中寫入數(shù)據(jù), 是自己沒有弄明白的,這里是一個坑。 在使用SetValue() 賦值的時候,需要將Key 設(shè)置為 "", 不然不能往(默認)這一項中寫入值。
四. 如何傳遞參數(shù)
啟動了客戶端程序這遠遠還不夠,如何能夠?qū)⒕W(wǎng)頁上的參數(shù)傳遞到客戶端程序中。
static void Main(string[] args)
關(guān)鍵點就在這里, 主程序進入之后,使用參數(shù)數(shù)組 args 接收外來參數(shù)。
<a href="gitwms:441">點擊這里啟動程序</a>
點擊這個連接會將參數(shù) gitwms:441 全部傳入到args中, gitwms:**** 后可以跟任意的參數(shù), 包括JSON字符串。這樣就方便多了,獲取參數(shù)之后就可以做相應(yīng)的操作。
以上程序操作是為了啟動客戶端的打印而做的,這里不一定做的很好,但是也不失為一種辦法。
該文章在 2024/2/19 18:04:08 編輯過