在网页上调起本机C#程序
前言
最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止)
网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的
我之前做了个管理电影的项目部署在 NAS 上自己用,就需要实现在网页上一键调用电脑上的 Potplayer 播放电影,这时候直接掏出 C# 写一个客户端就非常方便了
注册表操作
在 Windows 上实现就是通过注册表,将 Scheme 和对应的程序添加进去。其他系统暂时没需要就还没研究,估计也是类似的。
需要配置一下 SchemePrefix ,本文例子中是 demo
在网页上使用 demo:// 开头的链接就可以唤起本机的程序了~
using System.Diagnostics;
using System.Web;
using Microsoft.Win32;
const string AppName = "DemoApp";
const string SchemePrefix = "demo";
// 初始化注册表
void InitReg() {
if (!OperatingSystem.IsWindows()) return;
var path1 = AppName;
var path2 = $@"{path1}\shell\open\command";
// 设置协议名称
var key1 = Registry.ClassesRoot.OpenSubKey(path1, true);
if (key1 == null) {
key1 = Registry.ClassesRoot.CreateSubKey(path1);
}
key1.SetValue("URL Protocol", "");
key1.SetValue(null, $"URL:{SchemePrefix}");
var key2 = Registry.ClassesRoot.OpenSubKey(path2, true);
if (key2 == null) {
key2 = Registry.ClassesRoot.CreateSubKey(path2);
}
var exePath = Environment.ProcessPath ?? "";
key2.SetValue(null, $"\"{exePath}\" \"%1\"");
}
参数解析
因为是随手写的小工具,我也没有用命令行解析的库
如果用第三方库代码会更优雅
这里就做了两个命令,一个 install 另一个 open
手动执行 install 会在注册表里添加配置,之后这个程序文件就不要移动了,后续网页调起需要执行这个程序。
open 命令是网页调起时执行的,注意命令参数里的字符需要 URL 转义。
string action = "", value = "";
string[] cmdArgs = Environment.GetCommandLineArgs();
if (cmdArgs.Length > 1) {
var arg = cmdArgs[1];
Console.WriteLine($"cmd args: {arg}");
if (arg.StartsWith($"{SchemePrefix}://")) {
arg = arg.Replace($"{SchemePrefix}://", "");
}
if (arg.EndsWith("/")) {
arg = arg.Substring(0, arg.Length - 1);
}
var split = arg.Split("//");
action = split[0];
value = split.Length > 1 ? split[1] : "";
Console.WriteLine($"action: {action}, value: {value}");
}
switch (action) {
case "install":
Console.WriteLine("init reg...");
InitReg();
Console.WriteLine("init reg finished.");
break;
case "open":
var path = HttpUtility.UrlDecode(value);
Console.WriteLine($"open file/dir: {path}");
if (OperatingSystem.IsWindows())
Process.Start($"C:\\Windows\\explorer.exe", path);
if (OperatingSystem.IsLinux())
Process.Start("xdg-open", path);
break;
default:
Console.WriteLine("不知道做啥~");
break;
}
参考资料
- 如何在网页上打开本地应用 - https://segmentfault.com/a/1190000040237895
- C#进行注册表和键值操作 - https://zhuanlan.zhihu.com/p/403162888
在网页上调起本机C#程序的更多相关文章
- 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序
1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...
- 基于qml创建最简单的android机图像采集程序
前提是在已经搭建为android编写程序的qt平台上面,我们只需要简单几部就可以搭建最简单的android机图像采集程序 1.生成新的ququick app 2.在配置中添加 multimedia,因 ...
- Silverlight调用本机exe程序
要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须 ...
- [转]从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法
这个方法主要思路是利用自定义URL Protocol来调用应用程序.浏览器在解析到自定义URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数.对于我这个项 ...
- 如何上传网站程序(文件浏览器上传网页、FileZilla上传网站程序)
问题场景: 网页制作完成后,程序需上传至虚拟主机. 注意事项: Windows系统的主机请将全部网页文件直接上传到FTP根目录,即 / . Linux系统的主机请将全部网页文件直接上传到 /htdoc ...
- python3下爬取网页上的图片的爬虫程序
import urllib.request import re #py抓取页面图片并保存到本地 #获取页面信息 def getHtml(url): html = urllib.request.urlo ...
- WiFi-ESP8266入门http(3-3)网页认证上网-post请求-ESP8266程序
第一版 原型系统 连上西电的网 直接发送上网的认证信息 返回认证结果网页 成功上网 #include <ESP8266WiFi.h> #define Use_Serial Serial s ...
- PLC与上位机的socket通讯——上位机C#程序(二)
C#的网口通信 一.命令行 客户端程序:using System;using System.Collections.Generic;using System.Linq;using System.Tex ...
- Linux-开机启动程序
尝试一下几种方法: 1.修改 /etc/rc.local文件. 在exit0 前添加启动命令 2.在/home/pi/.config/autostart/ 下添加.desktop 在.config ...
- ATM机小程序
用规范化项目录的格式模拟一个ATM系统. 项目功能: 登录(可支持多个账户(非同时)登录) 注册 查看余额 存钱 转账(给其他用户转钱) 查看账户流水 退出 提供的思路:ATM直译就是取款机,但是咱们 ...
随机推荐
- AD(Active Directory )域的搭建与操作
AD 域的搭建与操作 一.准备工作 准备好 VM 虚拟机和 Server 的安装包. 二.安装 Server 2022 选择标准且有图形界面的进行安装. 选择自定义安装方式. 为虚拟机 server2 ...
- Go make 介绍
Go 语言中的 make 函数用于创建和初始化特定类型的对象,主要是用于创建切片(slice).映射(map)和通道(channel).make 函数与 new 函数不同,new 函数是用于分配内存, ...
- Kubernetes-3.2:kubespray安装高可用k8sv1.20.2集群及常见报错解决
kubespray安装高可用k8s集群 环境介绍 系统环境 主机名 / IP地址 角色 内核版本 CentOS 7.6.1810 master1 / 192.168.181.252 master &a ...
- mybatis-plus批量增加、批量修改样例+建表语句+postman接口
使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是"新增"和"修改"方法是对一条数据进行处理的,如果有一万条数据就会和数据库 ...
- 使用 Helm 在 Kubernetes 上安装 Consul
Consul Sync 部署 官方文档部署:https://developer.hashicorp.com/consul/docs/k8s/installation/install 部署版本 1.14 ...
- CA-TCC: 半监督时间序列分类的自监督对比表征学习《Self-supervised Contrastive Representation Learning for Semi-supervised Time-Series Classification》(时间序列、时序表征、时间和上下文对比、对比学习、自监督学习、半监督学习、TS-TCC的扩展版)
现在是2023年11月27日,10:48,今天把这篇论文看了. 论文:Self-supervised Contrastive Representation Learning for Semi-supe ...
- Filter——过滤器
Filter Filter 快速入门 Filter 执行流程 1.放行前,对 request 数据进行处理 2.放行后,对 response 数据进行处理 ...
- T2 的莫反式子
正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...
- [OI] 平衡树
1. 二叉查找树 二叉查找树的思想和优先队列比较像,都是把若干个数据按一定规则插到一棵树里,然后就可以维护特定的信息. 在优先队列的大根堆实现里,我们让每棵子树的根节点都大于它的儿子,这样就可以保证根 ...
- IDEA更改远程git仓库地址
前言 我们在使用IDEA开发时,一般会配置好对应的git仓库,这样就比较容易对代码进行控制以及协同开发. 但有时候,我们远程的仓库地址由于这样那样的原因,需要迁移(这在爱折腾的企业是常有的事情). ...