tft每日頭條

 > 科技

 > c語言信息管理系統的菜單

c語言信息管理系統的菜單

科技 更新时间:2024-07-17 15:33:17

c語言信息管理系統的菜單?為了将“解決自媒體一鍵多平台發布”項目做得更适合自己的使用習慣,Windows端的桌面版也立項了,我來為大家科普一下關于c語言信息管理系統的菜單?以下内容希望對你有幫助!

c語言信息管理系統的菜單(C創建系統右鍵菜單按鈕關聯指定程序)1

c語言信息管理系統的菜單

前言

為了将“解決自媒體一鍵多平台發布”項目做得更适合自己的使用習慣,Windows端的桌面版也立項了。

本篇文章分享的内容是:實現系統右鍵菜單按鈕關聯桌面程序問題。

一、開發環境
  • vs2019
  • Windows 10
二、具體代碼

本次實現系統右鍵菜單按鈕功能,是通過Windows注冊表實現的。

1、訪問HKEY_CURRENT_USER

使用HKEY_CURRENT_USER,是為了避免向用戶申請管理員權限。具體代碼如下:

//using Microsoft.Win32; var userRegistry = Registry.CurrentUser;

2、訪問Software\Classes\*\shell

當前用戶的右鍵菜單按鈕信息(僅指文件),是儲存在Software\Classes\*\shell中的,所以我們需要拿到shell的寫權限。具體代碼如下:

var shellRegistryKey = userRegistry.OpenSubKey("Software").OpenSubKey("Classes").OpenSubKey("*").OpenSubKey("shell", true);

提示:OpenSubKey("shell", true)中的第二個參數設置為true,是為了在shell中寫入子項(也就是拿到shell的寫權限)。

3、判斷準備生成的右鍵菜單按鈕名是否存在

為防止重複寫入導緻出錯,先判斷子項名(右鍵菜單按鈕名)是否存在。代碼如下:

var isRegistryKeyNameExsit = shellRegistryKey.GetSubKeyNames().Contains(keyName);

4、寫入右鍵菜單按鈕名

首先shell中寫入子項(可以理解為在注冊表中的名字),然後設置剛創建的子項在右鍵菜單中的按鈕名。具體代碼:

var contextMenuRegistryKey = shellRegistryKey.CreateSubKey(keyName); contextMenuRegistryKey.SetValue("", keyName);

提示:contextMenuRegistryKey.SetValue("", keyName)中的keyName是顯示在右鍵菜單中的按鈕名,可以不同子項名,使用其他名字。

5、關聯指定程序

首先在新建的子項中創建名為command的子項,然後設置子項中的默認項的值為"程序路徑" "%1",這樣就将指定程序與右鍵菜單按鈕進行了關聯。

contextMenuRegistryKey.CreateSubKey("command"); command.SetValue("", $"\"{programPath}\" \"%1\"");

提示:"程序路徑" "%1"中%1是為了把右鍵打開關聯程序時,把選擇的文件路徑傳給關聯程序。

如果關聯程序時Winform程序,則還需要修改Winform默認程序,實現接收傳入的文件路徑的功能。

5.1、修改Winform默認程序(1)修改Program.cs

将默認的無參Main()方法修改為如下代碼:

static void Main(string[] args)

(2)修改Main()方法的默認啟動窗口程序

代碼如下:

Application.Run(new Form1(args));

(3)修改Form1.cs

為了接受參數,需要一個新的構造函數,具體代碼如下:

public Form1(string[] args) : this() { this.label1.Text = string.Join(",", args); }

提示:this()是為了不修改默認的無參構造函數,直接調用它。

三、完整的程序代碼1、注冊表修改

/// <summary> /// 注冊表幫助類 /// 版本:v1 /// 日期:2022年10月15日 /// 作者:hxsfx /// </summary> public class RegistryHelper { /// <summary> /// 計算機\HKEY_CURRENT_USER\Software\Classes\*\shell /// </summary> private static RegistryKey RegistryUserSoftwareClassesAllShell { get { return Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Classes").OpenSubKey("*").OpenSubKey("shell", true); } } /// <summary> /// 生成右鍵菜單按鈕(當前用戶) /// </summary> /// <param name="keyName">右鍵菜單名</param> /// <param name="programPath">點擊按鈕後打開的程序路徑</param> public static void CreateUserContextMenu(string keyName, string programPath) { if (!RegistryUserSoftwareClassesAllShell.GetSubKeyNames().Contains(keyName)) { var contextMenuRegistryKey = RegistryUserSoftwareClassesAllShell.CreateSubKey(keyName); contextMenuRegistryKey.SetValue("", keyName); var command = contextMenuRegistryKey.CreateSubKey("command"); command.SetValue("", $"\"{programPath}\" \"%1\""); } } /// <summary> /// 删除右鍵菜單按鈕(當前用戶) /// </summary> /// <param name="keyName">右鍵菜單名</param> public static void DeleteUserContextMenu(string keyName) { if (RegistryUserSoftwareClassesAllShell.GetSubKeyNames().Contains(keyName)) { RegistryUserSoftwareClassesAllShell.DeleteSubKeyTree(keyName); } } }

2、Winform代碼(1)Program.cs

static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(args)); } }

(1)窗口Form1.cs

public partial class Form1 : Form { public Form1(string[] args) : this() { this.label1.Text = string.Join(",", args); } public Form1() { InitializeComponent(); } }

四、最後

其實個人不是很喜歡通過注冊表來實現功能,一方面是不了解注冊表,另一方面是總覺得注冊表不夠優雅。哈哈~

如果各位小夥伴有什麼其他更好的辦法,可以告訴我哦~

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved