首页 > 编程语言 >在网页上调起本机C#程序

在网页上调起本机C#程序

时间:2024-11-14 20:59:12浏览次数:1  
标签:起本机 网页 C# arg var Console open

在网页上调起本机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;
}

参考资料#

作者:DealiAxy

出处:https://www.cnblogs.com/deali/p/18546412

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

微信公众号:「程序设计实验室」
新版StarBlog已经上线,地址:http://blog.deali.cn

微信公众号:「程序设计实验室」 专注于互联网热门新技术探索与团队敏捷开发实践,包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等,欢迎一起探讨技术,分享学习实践经验。    分类: .Net / C#语言  标签: C# Buy me a cup of coffee ☕.    

标签:起本机,网页,C#,arg,var,Console,open
From: https://www.cnblogs.com/sexintercourse/p/18546803

相关文章

  • WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象
    WWDC23,SwiftUI5和SwiftData的初印象东坡肘子​ ​关注他 17人赞同了该文章WWDC2023正在如火如荼地进行。苹果不仅带来了全新形态的硬件产品,还推出了几个相当震撼的新框架。本文将聊聊我对本届WWDC中SwiftUI5.0和SwiftData的初步印象。......
  • Typescript面试题
    简述typescript简称ts,是js的一个超集,也是带有类型检测的js,拓展了js语法。优点:程序更容易理解;减少错误(编译期间排除常见错误);包容性强(兼容js)。特点:跨平台;面向对象(类、接口、枚举);类型检测。 ts的数据类型除js的类型外,还包含enum(枚举)、any(任意值)、void(表示无,常用于表示无返回值......
  • windows C#-查询表达式基础(一)
    查询是什么及其作用是什么?查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织。查询与它生成的结果不同。通常情况下,源数据按逻辑方式组织为相同类型的元素的序列。例如,SQL数据库表包含行的序列。在XML文件中,存在XML元素的“序列”(......
  • 生成本地开发环境中的Https SSL证书和私钥的工具:mkcert
    mkcert 是一个用于生成本地开发环境中的SSL证书和私钥的工具。它可以帮助开发者在不需要购买或配置复杂证书颁发机构(CA)的情况下,快速创建受信任的SSL证书。这对于本地开发和测试Web应用非常有用,因为它可以确保HTTPS连接的安全性。特点简单易用:mkcert 提供了一个简单的命令行......
  • XDF OJ P Answer-C P1006
    (说明:此代码只作为参考,并非绝对的正确代码,但是保证AC)题目:d结尾的单词个数描述有天小盼在学习英语课文的时候,看到了类似这样的句子:Misswhitelook,它有一个长鼻子和一条短尾巴,Sarah它有一双小眼睛和大耳朵。单词之间用空格隔开(可能有多个空格),小盼突发奇想,想知道以d结尾的......
  • ABB AC900F学习笔记331:使用ST做自定义功能块,计算最近60秒的分钟均值和最近60分钟的小
    前面自己学习了在西门子TIA使用SCL编程,施耐德Unity中使用ST编程做分钟均值和小时均值的方法,今晚在家练习了在ABBFreelance中自定义功能块使用ST语言做分钟均值和小时均值。新建项目、插入硬件、仿真器、操作站等不做介绍。新建一个用户功能块池,下面建一个功能块类。功能块类定......
  • Go - JSON Encoding Nuances
     ......
  • Windows每次开机键盘无法使用,需要重新拔插键盘USB接口的终极解决方案(filco键盘)
    我试了如下方法:1.电源选项中的USB选择性暂停:打开控制面板——电源选项——更改计划设置——更改高级电源设置——USB设置——将USB选择性暂停改为“已禁用”。2.关闭USB的省电策略:右键我的电脑——属性——设备管理器——通用串行总线控制器——右键USBHub——属性——电源管理......
  • C++ 友元跨命名空间使用
    以+运算符重载为例:#include<iostream>#include<string>//前置声明是必须的namespacemydog{classDog;}namespacemyadd{mydog::Dogoperator+(constmydog::Dogdog1,constmydog::Dogdog2);}namespacemydog{classDog{friend......
  • EESA01 Introduction to Environmental
    EESA01IntroductiontoEnvironmentalScienceLaboratoryManualFall2024Lab2:WeatherandClimateDataIntroductioInlectures,wewillsoonbegindiscussingtheEarth’senergybalance,thebasicsofclimate,andotheratmosphericphenomena.Thislabwil......