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

原理: 先注册表中添加软件的具体信息,然后通过 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. Thread中的一些方法

    Thread中的一些方法: currentThread() 返回对当前正在执行的线程对象的引用(实现接口方式时使用). sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠( ...

  2. Css实现元素的垂直居中

    前言: 在写CSS的时候让元素在高度固定的容器中垂直居中是很简单的,譬如设置容器的padding或者元素的margin之类的都可以做到:让元素在容器中水平居中也有text-align:center.m ...

  3. HDU 5628 Clarke and math——卷积,dp,组合

    HDU 5628 Clarke and math 本文属于一个总结了一堆做法的玩意...... 题目 简单的一个式子:给定$n,k,f(i)$,求 然后数据范围不重要,重要的是如何优化这个做法. 这个 ...

  4. [POI2011]Śmieci

    [POI2011]Śmieci 题目大意: 一个\(n(n\le10^5)\)个点\(m(m\le10^6)\)条边的无向图,每条边有边权\(0/1\),试找出若干个环,使得每次翻转环上所有边的权值, ...

  5. ELASTIC API

    运维常用API. curl -XGET 'localhost:9200/_cat/indices?v&pretty' #查看索引 curl -XGET 'localhost:9200/_cat ...

  6. LeetCode全文解锁 √

    分享一波大牛整理leetcode,方便整理思路 可以点击下载

  7. linux目录的权限

    Answer: When applying permissions to directories on Linux, the permission bits have different meanin ...

  8. [Android] 关于Android的问号?和@符号的用法

    @表示引用资源,声明这是一个资源引用-随后的文本是以@[package:]type/name形式提供的资源名.@android:string表明引用的系统的(android.*)资源@string表示 ...

  9. fetch使用的常见问题及其解决办法

    摘自: https://segmentfault.com/a/1190000008484070 fetch使用的常见问题及其解决办法 javascript wonyun 2月25日发布 |   0 收 ...

  10. PL/SQL学习笔记之存储过程

    一:PL/SQL的两种子程序 子程序:子程序是执行一个特定功能.任务的程序模块.PL/SQL中有两种子程序:函数  和  过程. 函数:主要用于计算并返回一个值. 过程:没有直接返回值,主要用于执行操 ...