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写入注册表(模拟上面直接注册注册表,减少用户操作)
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程序(带参数)的更多相关文章
- SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);
SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...
- js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中
ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...
- ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)
此解决方案原理: 1.在ViewController.h中声明方法和成员变量,以及webView的委托: // // ViewController.h // JS_IOS_01 // // Cr ...
- js调用本地程序
前几天,做项目时候用到js调用本地的程序,找了好多资料,一种是写入注册表,一种是写一个浏览器插件,相对来说,写一个注册表更简单一点,因为需求很紧.下面就是我的总结,希望可以对你们有所帮助,具体从哪里找 ...
- [Winform-WebBrowser]-在html页面中js调用winForm类方法
在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部: 1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类可以com组件的 ...
- C# winForm webBrowser页面中js调用winForm类方法(转)
有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部: 1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...
- java jsp调用shell(带参数)脚本并返回值
test.jsp <%@ page language="java" import="java.util.List,java.util.ArrayList,java. ...
- 自定义Windows右击菜单调用Winform程序
U9_Git中ignore文件处理 背景 U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak 文件 Enum.cs结尾的文件,还有许多 extand ...
- Js调用exe程序方法(通过URL Protocol实现网页调用本地应用程序)
1.使用记事本(或其他文本编辑器)创建一个protocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROO ...
随机推荐
- prufer序列计数的一些结论
\(prufer\)序列和完全图的生成树一一对应(考虑构造) 完全图的生成树个数为\(n^{n - 2}\) 满足第\(i\)个点的度数为\(d_i\)的生成树为\(\frac{n!}{\prod ( ...
- [AGC025B]RGB Coloring
[AGC025B]RGB Coloring 题目大意: 有\(n(n\le3\times10^5)\)个格子,每个格子可以选择涂成红色.蓝色.绿色或不涂色,三种颜色分别产生\(a,b,a+b(a,b\ ...
- PHP类的继承
每个子类(也叫派生类)都会在设置自己的属性前调用父类的构造方法.父类(也叫基类或超类)现在仅知道自己的数据,子类一般是父类的特例,要避免告诉父类任何关于子类的信息 以下为一个使用继承的实例: < ...
- jd-gui的使用方法
java的反编译工具,简单使用: 打开文件.单击“file”从中选择“Open File ...“选项,弹出一个文件选择框,可以选择要打开的文件,或者直接单击文件夹图标,直接弹出文件选择框:从文件选择 ...
- python面向对象笔记
一.封装(属性/私有方法/公有方法/静态方法/构造函数...) # 定义一个类 class Animal: # 私有成员(用_开头的约定为私有成员 - 注:仅仅是君子协定) _age = 0 # 构造 ...
- C# Round源码
在日常开发中经常遇到四舍五入的情况比如 Math.Round(1.25, 1),首先我们要知道这里的Round 其实是银行家算法,具体可以参考Round() 四舍五入 js银行家算法 那么C#是如何实 ...
- JAVA代码中获取JVM信息
一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...
- 2D游戏新手引导点光源和类迷雾实现
一.新手引导须要的遮罩效果 一般做新手引导的时候,会把游戏画面变的半黑,然后须要玩家点击的地方就亮起来.经常使用的做法是採用遮罩来实现,可是仅仅能实现方形的,不能不规则图形.以及是全然挖空.做不到渐变 ...
- C# System.Collections.Stack
using System; using System.Collections; public class SamplesStack { public static void Main() { // C ...
- 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
学校要开设选修课,人工选课实施了两年,耗时耗力,于是打算用网上选课,在网上搜索了一番,没多少实用的,有一个网上用的比较多的,功能太简单了,于是打算自己开发一个,功能参考了部分学校的功能,也有基于Aja ...