我们会发现,我们点击迅雷下载的时候  网页可以调用应用程序,而且连接会传入迅雷,这个是怎么做到的呢?

原理: 先注册表中添加软件的具体信息,然后通过 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写入注册表(模拟上面直接注册注册表,减少用户操作)

using Microsoft.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]
static void Main(string[] args)
{ if (args.Length > 0)
{
MessageBox.Show("来了");
MessageBox.Show(args[0].ToString());
} Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}

--------------------------------其他注册表操作介绍---------------------------------------------------------

注册表巢

在注册表中,最上面的节点是注册表巢(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();
												

js调用winform程序(带参数)的更多相关文章

  1. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

  2. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

    ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...

  3. ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)

    此解决方案原理: 1.在ViewController.h中声明方法和成员变量,以及webView的委托: // //  ViewController.h //  JS_IOS_01 // //  Cr ...

  4. js调用本地程序

    前几天,做项目时候用到js调用本地的程序,找了好多资料,一种是写入注册表,一种是写一个浏览器插件,相对来说,写一个注册表更简单一点,因为需求很紧.下面就是我的总结,希望可以对你们有所帮助,具体从哪里找 ...

  5. [Winform-WebBrowser]-在html页面中js调用winForm类方法

    在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部: 1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类可以com组件的 ...

  6. C# winForm webBrowser页面中js调用winForm类方法(转)

      有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部:   1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...

  7. java jsp调用shell(带参数)脚本并返回值

    test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...

  8. 自定义Windows右击菜单调用Winform程序

    U9_Git中ignore文件处理 背景 U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak 文件 Enum.cs结尾的文件,还有许多 extand ...

  9. Js调用exe程序方法(通过URL Protocol实现网页调用本地应用程序)

      1.使用记事本(或其他文本编辑器)创建一个protocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROO ...

随机推荐

  1. Spark函数式编程进阶

    函数式编程进阶 1.函数和变量一样作为Scala语言的一等公民,函数可以直接复制给变量: 2.函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是匿名函数赋值给 ...

  2. BZOJ.1070.[SCOI2007]修车(费用流SPFA)

    题目链接 /* 神tm看错题*2.. 假如人员i依次维修W1,W2,...,Wn,那么花费的时间是 W1 + W1+W2 + W1+W2+W3... = W1*n + W2*(n-1) + ... + ...

  3. bootstrap中的行和列布局

    <!doctype html><html > <head> <meta charset="utf-8"> <link rel= ...

  4. JVM内存管理--GC算法详解

    标记/清除算法 首先,我们回想一下上一章提到的根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期 ...

  5. jupyter notebook 在mac OS上的安装

    一.关于Anaconda python中有很多包,类似于java中的jar包,java中用maven.gradle来管理依赖的jar包,而在python中类似的工具就是anaconda(当然还有其它工 ...

  6. delphi Tdxribbon 设置背景和skin 皮肤

    https://blog.csdn.net/maxwoods/article/details/8592389 http://www.cnblogs.com/baoluo/archive/2011/04 ...

  7. ArcGIS Pro 获得工具的个数

    import arcgisscripting import string; gp = arcgisscripting.create(9.3); ##多少个工具箱 toolboxes = gp.list ...

  8. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  9. Installing Windows Features without Internet

    To set the source file path for the sxs folder, complete these steps: Ensure you have the correct in ...

  10. C语言的原码,反码,补码

    1)原码表示 原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示.设有一数为x,则原码表示可记作[x]原. 例如,X1= +1010110 X2= 一1 ...