網(wǎng)頁(yè)調(diào)起電腦程序是經(jīng)常用到的場(chǎng)景,比如百度網(wǎng)盤(pán)下載,加入 QQ 群之類(lèi)的
注冊(cè)表操作#
在 Windows 上實(shí)現(xiàn)就是通過(guò)注冊(cè)表,將 Scheme 和對(duì)應(yīng)的程序添加進(jìn)去。其他系統(tǒng)暫時(shí)沒(méi)需要就還沒(méi)研究,估計(jì)也是類(lèi)似的。
需要配置一下 SchemePrefix
,本文例子中是 demo
在網(wǎng)頁(yè)上使用 demo://
開(kāi)頭的鏈接就可以喚起本機(jī)的程序了~
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\"");
}
參數(shù)解析#
因?yàn)槭请S手寫(xiě)的小工具,我也沒(méi)有用命令行解析的庫(kù)
如果用第三方庫(kù)代碼會(huì)更優(yōu)雅
這里就做了兩個(gè)命令,一個(gè) install 另一個(gè) open
手動(dòng)執(zhí)行 install 會(huì)在注冊(cè)表里添加配置,之后這個(gè)程序文件就不要移動(dòng)了,后續(xù)網(wǎng)頁(yè)調(diào)起需要執(zhí)行這個(gè)程序。
open 命令是網(wǎng)頁(yè)調(diào)起時(shí)執(zhí)行的,注意命令參數(shù)里的字符需要 URL 轉(zhuǎn)義。
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("http://");
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;
}
參考資料#
轉(zhuǎn)自https://www.cnblogs.com/deali/p/18546412
該文章在 2024/11/15 8:49:14 編輯過(guò)