前言

最近开始整理笔记里的库存草稿,本文是 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;
}

参考资料

在网页上调起本机C#程序的更多相关文章

  1. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...

  2. 基于qml创建最简单的android机图像采集程序

    前提是在已经搭建为android编写程序的qt平台上面,我们只需要简单几部就可以搭建最简单的android机图像采集程序 1.生成新的ququick app 2.在配置中添加 multimedia,因 ...

  3. Silverlight调用本机exe程序

    要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须 ...

  4. [转]从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法

    这个方法主要思路是利用自定义URL Protocol来调用应用程序.浏览器在解析到自定义URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数.对于我这个项 ...

  5. 如何上传网站程序(文件浏览器上传网页、FileZilla上传网站程序)

    问题场景: 网页制作完成后,程序需上传至虚拟主机. 注意事项: Windows系统的主机请将全部网页文件直接上传到FTP根目录,即 / . Linux系统的主机请将全部网页文件直接上传到 /htdoc ...

  6. python3下爬取网页上的图片的爬虫程序

    import urllib.request import re #py抓取页面图片并保存到本地 #获取页面信息 def getHtml(url): html = urllib.request.urlo ...

  7. WiFi-ESP8266入门http(3-3)网页认证上网-post请求-ESP8266程序

    第一版 原型系统 连上西电的网 直接发送上网的认证信息 返回认证结果网页 成功上网 #include <ESP8266WiFi.h> #define Use_Serial Serial s ...

  8. PLC与上位机的socket通讯——上位机C#程序(二)

    C#的网口通信 一.命令行 客户端程序:using System;using System.Collections.Generic;using System.Linq;using System.Tex ...

  9. Linux-开机启动程序

    尝试一下几种方法: 1.修改  /etc/rc.local文件. 在exit0 前添加启动命令 2.在/home/pi/.config/autostart/  下添加.desktop 在.config ...

  10. ATM机小程序

    用规范化项目录的格式模拟一个ATM系统. 项目功能: 登录(可支持多个账户(非同时)登录) 注册 查看余额 存钱 转账(给其他用户转钱) 查看账户流水 退出 提供的思路:ATM直译就是取款机,但是咱们 ...

随机推荐

  1. zabbix 4.0监控web页面

    web监控 web监测是用来监控web程序的,可以监控web程序的平均下载速度.响应时间.HTTP状态码. 环境 至少有两台被监控主机 静态网页检测 选择监控主机 ​ 配置场景 web监测->创 ...

  2. js_for循环的错误

    本段代码实现的效果是遍历数组中的每个元素,给每个元素插入一个类名 for (var i = 0; i < dropdownLi.length; i++) { if(i == 1){ contin ...

  3. JDK有用的新特性-Switch

    目录 箭头表达式,新的 case 标签 yeild 返回值 Java Record Switch 的三个方面,参考: JEP 361 支持箭头表达式 支持 yied 返回值 支持 Java Recor ...

  4. canvas实现图片标记

    前言 由于业务需求,需要有一个图片标记功能,其实就是对图片画框画线做标记,类似微信的图片编辑 但是需要存下标记图及其标记的具体数据,.功能其实很简单,但刚开始的时候也是费了一些功夫的.我将原项目中该功 ...

  5. 五子棋AI:实现逻辑与相关背景探讨(下)

    前文回顾 在上篇文章中,我们约定了一种衡量格子价值的方式,如下表. 综合价值排序 己方价值 敌方价值 对应的奖励数值 1 Lv1 ? \(2^{20}\) 2 ? Lv1 \(2^{16}\) 3 L ...

  6. Angular 18+ 高级教程 – 盘点 Angular v14 到 v18 的重大改变

    前言 我在 <初识 Angular> 文章里有提到 Angular 目前的断层问题. 大部分的 Angular 用户都停留在 v9.0 版本. Why everyone stay v9.0 ...

  7. VS Code – Keyboard Shortcuts

    前言 记入一些自己常用到的 Keyboard Shortcuts 和 Extensions. Keyboard Shortcuts undo redo 鼠标坐标:shift + left/right ...

  8. ASP.NET Core Library – Excel 读写

    前言 以前写过 EPPlus 的笔记, 但后来 EPPlus 开始收费了.... (这好像是 .NET 生态的宿命) 在找替代方案中看中了微软的 Open XML SDK. 但经过一番折腾, 它确实太 ...

  9. nRF24L01芯片驱动记录

    nRF24L01芯片驱动记录 ​ 学习完了usb,了解了部分元器件的功能以及用途后,打算在端午假期用一天的时间完成一个小目标,不过实际上是花了一天半才成功实现,现将驱动nRF24L01芯片的整个过程记 ...

  10. 基于Tauri2+Vue3搭建桌面端程序|tauri2+vite5多窗口|消息提醒|托盘闪烁

    基于tauri2+vite5+vue3封装多窗口实践|自定义消息提醒|托盘右键菜单及图标闪烁 这段时间一直在捣鼓最新版Tauri2.x整合Vite5搭建桌面端多开窗体应用实践.tauri2.0相较于1 ...