在网页上调起本机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直译就是取款机,但是咱们 ...
随机推荐
- 彻底解决ROS1安装问题,一键解决远离rosdep init 和rosdep update出错
彻底解决ROS1安装问题 相信很多小伙伴在刚入门ROS的时候就遇到ROS安装这个拦路虎. 普遍出错的环节在rosdep init 和rosdep update,由于要访问国外的站点就导致国内访问很容易 ...
- Hexo-GitHub部署魔改第一步-config
Hexo-GitHub部署魔改第一步_config.yml 1. config.yml # Hexo Configuration ## Docs: https://hexo.io/docs/confi ...
- SpringMVC的视图
目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户Spr ...
- idea 的Tomcat 的简单配置
不限速网盘下载: https://kohler.lanzouv.com/iSSfc0akw3vc 官网下载: https://tomcat.apache.org/download-80.cgi 正常解 ...
- 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?
为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义? 类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址. 当你在类的头文件中声明一个静态成员变量时,这只 ...
- 用CSS border画一个铅笔
先上效果图 该例子来自 CSS世界 的书中项目 总结技巧如下: 巧用 border 和 伪元素 来 绘制层叠效果. 使用 transform-origin 来改变元素的轴心 使用 filter:dro ...
- vue 实现组件全屏展示及退出
vue 实现组件全屏展示及退出 一.组件 采用 vue-fullscreen 组件 二.实现方式 <fullscreen ref="fullscreen" @change=& ...
- MDC – Checkbox
前言 Checkbox 不是搭配 TextField 使用, 而是搭配 FormField. 所以独立一篇来写. 参考 Docs – Selection controls: checkboxes 效果 ...
- EF Core – 乐观并发
前言 之前写过 EF Core 悲观并发, 这篇主要讲一下乐观并发. 乐观并发的机制可以看这篇. Why Need This? 如果你用 EF Core 做数据管理, 建议你每个 Entity 都配置 ...
- PTA甲级—树
1.树的遍历 1004 Counting Leaves (30分) 基本的数据结构--树,复习了链式前向星,bfs遍历判断即可 #include <cstdio> #include < ...