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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言variant是什么变量,介绍一些常用数据类型的使用。先定义一些常见类型变量借以.doc...

介绍一些常用数据类型的使用。先定义一些常见类型变量借以说明int i 100;long l 2001;float f300.2;double d12345.119;char username[]"张三";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,tem…

What code you will get when you create a wcf library

创建wcf服务库的时候,系统自动生成的代码 // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。[ServiceContract]public interface IService1{[OperationContract]string GetData(int value);[OperationC…

LeetCode 1868. 两个行程编码数组的积(双指针)

文章目录1. 题目2. 解题2.1 模拟超时2.2 优化1. 题目 行程编码(Run-length encoding)是一种压缩算法,能让一个含有许多段连续重复数字的整数类型数组 nums 以一个(通常更小的)二维数组 encoded 表示。 每个 encoded[…

结巴分词有前空格_jieba英文空格分词问题

1.对于关键词存在空格或者特殊符号的情况下,jieba无法分出该词2.在github上找到了一个解决方案,修改jieba源码__init__.py免费分享,造损免责。打开默认词典(根目录)或自定义词典,把所有用来间隔词频和词性的空格间隔符改成(选用是…

linux socket 面试题,面试题

1、网络TCP/IP协议2、三层路由架构,搭建局域网3、自动化测试工具robotframework的使用,怎么管理测试脚本4、shell脚本可用过?怎么替换一个文本中指定的内容?5、python的多线程怎么使用的?正则表达式中serach和match的区…

Core Location :⽤用于地理定位

Core Location :⽤用于地理定位 在移动互联⽹网时代,移动app能解决⽤用户的很多⽣生活琐事,⽐比如 导航:去任意陌⽣生的地⽅方 周边:找餐馆、找酒店、找银⾏行、找电影院 在上述应⽤用中,都⽤用到了地图和定位功能,在iOS开发中,要想加⼊入这2⼤大功 能,必须基于2个框架进⾏…

LeetCode MySQL 1587. 银行账户概要 II

文章目录1. 题目2. 解题1. 题目 表: Users ----------------------- | Column Name | Type | ----------------------- | account | int | | name | varchar | -----------------------account 是该表的主键. 表中的每一行包含银行里中每一个用户的账号…

取多补少C语言,leetcode题目: 数字的补数 的C语言解法

题目链接题目内容给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。注意:给定的整数保证在32位带符号整数的范围内。你可以假定二进制数不包含前导零位。示例 1:输入: 5输出: 2解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需…

wpf mvvm MenuItem的Command事件

这是一个事件的辅助类,可以通过它实现MenuItem的Command事件 public class MyCommands : Freezable, ICommand, ICommandSource{public MyCommands() {}public static readonly DependencyProperty CommandParameterProperty DependencyProperty.Register("Com…

python写字板_pywinauto简单操作写字板的例子

前段时间写了做web程序界面自动化的简单例子,今天写一下windows gui程序界面自动化测例子吧。def openwordpad():app application.Application()wordpadapp.start(r"C:\Program Files\Windows NT\Accessories\wordpad.exe")wordpad.wordpadclass.RICHEDI…

c语言 spawn函数,我在electron程序中spawn了一个C语言程序作为子进程,我该如何与这个子进程通信?...

C语言的代码为:#include int main(){int i 0;scanf("%d", &i);printf("%d\n", i);scanf("%d", &i);printf("%d\n", i);return 0;}我用sub_process.stdin.write("1\n");后,它不会立即输出&am…

LeetCode MySQL 1667. 修复表中的名字

文章目录1. 题目2. 解题1. 题目 表: Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | -------------------------user_id 是该表的主键。 该表包含用户的 I…

junit跳过datasource_maven – spring集成测试无法加载上下文“另一个资源已存在,名称为dataSource”...

我正在使用spring-boot 1.4.3中引入的测试注释进行集成测试RunWith(SpringRunner.class)SpringBootTestpublic class MyServiceIT { }根据documentation,测试上下文被缓存并重用以加速集成测试.这种行为是我想要的,因为它需要大量的时间来初始化应用程序上下文.我的故障安全插件…

7.Reverse Integer (INT; Overflow)

Reverse digits of an integer. Example1: x 123, return 321Example2: x -123, return -321 思路:要注意溢出。用以下做法,会溢出。 class Solution { public:int reverse(int x) {int ret 0;while(x){ret ret * 10 x%10;x / 10;}return ret;} };…

c语言汇编混合编程写一个乘法,求通过C语言实现矩阵的加、减及乘法。要自己写的,不要复制过来...

满意答案eevfikx22013.11.28采纳率:53% 等级:13已帮助:8891人#include using namespace std;int main(){int am3,bm3,an3,bn3;int a[am][an];int b[bm][bn];for(int i0;i{for(int j0;j{a[i][j]i*amj;}}for(int i0;i{for(int j0;j{b[i][j]i…

LeetCode MySQL 1821. 寻找今年具有正收入的客户

文章目录1. 题目2. 解题1. 题目 表:Customers -------------------- | Column Name | Type | -------------------- | customer_id | int | | year | int | | revenue | int | --------------------(customer_id, year) 是这个表的主键。 这个表…

【Head First Java 读书笔记】(一)基本概念

Java的工作方式 你要做的事情就是会编写源代码 Java的程序结构 类存于源文件里面 方法存在类中 语句存于方法中 剖析类 当Java虚拟机启动执行时,它会寻找你在命令列中所指定的类,然后它会锁定像下面这样一个特定的方法: public static void main(String[…

oid 值 内存使用_[技术干货] zabbix监控项原型组合键值

自动发现中监控项原型使用多个值组合成一个新的键值。这里我们以华为RH5885V3的内存为例:我们先walk出要用来作为组合键值的值,我们称之为VALUE。而OID节点后面延伸出来的数值,例如.1、.2、.3这种,我们称之为INDEX。组合键值的关键…

c语言从键盘输入asdfg输出asdfg,C语言复习题参考答案.doc

第1题功能:将十进制数转换成十六进制数。第2题功能:删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。第3题功能:以下程序是用选择法对10个整数按升序排序。第4题功能:以下程序的功能如(图1)。第5题功能&…

LeetCode MySQL 1853. 转换日期格式(日期格式化)

文章目录1. 题目2. 解题1. 题目 表: Days ------------------- | Column Name | Type | ------------------- | day | date | -------------------day 是这个表的主键。 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为&qu…