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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值