href 带参数 打开exe_js调用winform程序(带参数)
我們會發現,我們點擊迅雷下載的時候? 網頁可以調用應用程序,而且連接會傳入迅雷,這個是怎么做到的呢?
原理: 先注冊表中添加軟件的具體信息,然后通過 href 可以直接調用
1.寫入注冊表信息,注冊,如果不需要參數 只要第一個HKEY_CLASSES_ROOT\test 段落
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\test]"URL Protocol"="C://xx//xx.exe"[HKEY_CLASSES_ROOT\test\DefaultIcon]
@="C://xx//xx.exe"[HKEY_CLASSES_ROOT\test\shell]
[HKEY_CLASSES_ROOT\test\shell\open]
[HKEY_CLASSES_ROOT\test\shell\open\command]
@="C:\\xx\\xx.exe %1"
winfrom寫入注冊表(模擬上面直接注冊注冊表,減少用戶操作)
usingMicrosoft.Win32;//使用CreateSubKey()HKEY_CLASSES_ROOT下創建子項
RegistryKey hklm =Registry.ClassesRoot;
RegistryKey key= hklm.CreateSubKey(@"test");
key.SetValue("URL Protocol", "C://xx//xx.exe");
RegistryKey key2= key.CreateSubKey(@"DefaultIcon");
key2.SetValue("", "C://xx//xx.exe");
RegistryKey key3= key.CreateSubKey(@"shell");
RegistryKey key4= key3.CreateSubKey(@"open");
RegistryKey key5= key4.CreateSubKey(@"command");
key5.SetValue("", "C:\\xx\\xx.exe %1");
hklm.Close();
key.Close();
MessageBox.Show("初始化成功");
2.關聯
html端
var sessionId = "1";
location.href= "xx://" + sessionId;
winform端,在Program.cs 修改main方法
[STAThread]
staticvoidMain(string[] args)
{if (args.Length > 0)
{
MessageBox.Show("來了");
MessageBox.Show(args[0].ToString());
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(newMain());
}
--------------------------------其他注冊表操作介紹---------------------------------------------------------
注冊表巢
在注冊表中,最上面的節點是注冊表巢(registry hive)。
HKEY_CLASSES_ROOT(HKCR) ? ?包含系統文件類型的細節,以及應用程序可以打開的文件類型,它還包含所有COM組件的注冊信息。
HKEY_CURRENT_USER(HKCU) ? ?包含用戶目前登陸的機器的用戶配置,包括桌面設置、環境變量、網絡和打印機連接和其他定義用戶操作環境的變量。
HKEY_LOCAL_MACHINE(HKLM) ? ?是一個很大的巢,其中包含所有安裝到機器上的軟件和硬件的信息。
HKEY_USERS(HKUSR) ? ? ? ? ? ? ? ?包含所有用戶的用戶配置。
HKEY_CURRENT_CONFIG(HKCF) ?包含機器上硬件的信息。
二.注冊表類及常用屬性和函數
using Microsoft.Win32;
這個命名空間包含了注冊表相關的類。Registry類、RegistryKey類。
Registry類封裝了注冊表的七個基本主鍵:
Registry.ClassesRoot
對應于HKEY_CLASSES_ROOT主鍵
Registry.CurrentUser
對應于HKEY_CURRENT_USER主鍵
Registry.LocalMachine
對應于 HKEY_LOCAL_MACHINE主鍵
Registry.User
對應于 HKEY_USER主鍵
Registry.CurrentConfig
對應于HEKY_CURRENT_CONFIG主鍵
Registry.DynDa
對應于HKEY_DYN_DATA主鍵
Registry.PerformanceData
對應于HKEY_PERFORMANCE_DATA主鍵
RegistryKey類封裝了對注冊表的基本操作。包括讀、寫、刪等操作的常用函數:
Name
鍵的名稱(只讀)
SubKeyCount
鍵的子鍵個數
ValueCount
鍵包含的值的個數
Close()
關閉鍵
CreateSubKey()
創建給定名稱的子鍵
DeleteSubKey()
刪除指定的子鍵
DeleteSubKeyTree()
遞歸刪除子鍵及其所有的子鍵
DeleteValue()
從鍵中刪除一個指定的值
GetAccessControl()
返回指定注冊表鍵的訪問控制表
GetSubKeyNames()
返回包含子鍵名稱的字符串數組
GetValue()
返回指定的值
GetValueKind()
返回指定的值,檢索其注冊表數據類型
GetValueNames()
返回一個包含所有鍵值名稱的字符串數組
OpenSubKey()
返回表示給定子鍵的RegistryKey實例引用
SetAccessControl()
把訪問控制表(ACL)應用于指定的注冊表鍵
SetValue()
設置指定的值
注冊表項的創建、打開、刪除
1,創建
//使用CreateSubKey()在SOFTWARE下創建子項test
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.CreateSubKey(@"SOFTWARE\test");
hklm.Close();
hkSoftWare.Close();
2,打開
//使用OpenSubKey()打開項,獲得RegistryKey對象,當路徑不存在時,為Null。第二個參數為true,表示可寫,可讀,可刪;省略時只能讀。
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true);
hklm.Close();
hkSoftWare.Close();
3,刪除
//主要用到了DeleteSubKey(),刪除test項
RegistryKey hklm = Registry.LocalMachine;
hklm.DeleteSubKey(@"SOFTWARE\test", true); //為true時,刪除的注冊表不存在時拋出異常;當為false時不拋出異常。
hklm.Close();
四、注冊表鍵值的創建、打開和刪除
1,創建
//主要用到了SetValue(),表示在test下創建名稱為Name,值為RegistryTest的鍵值。第三個參數表示鍵值類型,省略時,默認為字符串
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test",true);
hkSoftWare.SetValue("Name", "RegistryTest", RegistryValueKind.String);
hklm.Close();
hkSoftWare.Close();
2,打開
//主要用到了GetValue(),獲得名稱為"Name"的鍵值
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true);
string sValue = hkSoftWare.GetValue("Name").ToString();
hklm.Close();
hkSoftWare.Close();
3,刪除
//主要用到了DeleteValue(),表示刪除名稱為"Name"的鍵值,第二個參數表示是否拋出異常
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE\test", true);
hkSoftWare.DeleteValue("Name", true);
hklm.Close();
hkSoftWare.Close();
五、判斷注冊表項、注冊表鍵值是否存在
//判斷注冊表項是否存在
private bool IsRegistryKeyExist(string sKeyName)
{
string[] sKeyNameColl;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftWare = hklm.OpenSubKey(@"SOFTWARE");
sKeyNameColl = hkSoftWare.GetSubKeyNames(); //獲取SOFTWARE下所有的子項
foreach (string sName in sKeyNameColl)
{
if (sName == sKeyName)
{
hklm.Close();
hkSoftWare.Close();
return true;
}
}
hklm.Close();
hkSoftWare.Close();
return false;
}
//判斷鍵值是否存在
private bool IsRegistryValueNameExist(string sValueName)
{
string[] sValueNameColl;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkTest = hklm.OpenSubKey(@"SOFTWARE\test");
sValueNameColl = hkTest.GetValueNames(); //獲取test下所有鍵值的名稱
foreach (string sName in sValueNameColl)
{
if (sName == sValueName)
{
hklm.Close();
hkTest.Close();
return true;
}
}
hklm.Close();
hkTest.Close();
return false;
}
六、程序自啟動程序
//開啟程序自啟動
string path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.SetValue("JcShutdown", path);
rk2.Close();
rk.Close();
//關閉程序自啟動
string path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
rk2.DeleteValue("JcShutdown", false);
rk2.Close();
rk.Close();
總結
以上是生活随笔為你收集整理的href 带参数 打开exe_js调用winform程序(带参数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 线程池的理解_JAVA线程池原
- 下一篇: LeetCode 1009. 十进制整数