c語言信息管理系統的菜單?為了将“解決自媒體一鍵多平台發布”項目做得更适合自己的使用習慣,Windows端的桌面版也立項了,我來為大家科普一下關于c語言信息管理系統的菜單?以下内容希望對你有幫助!
為了将“解決自媒體一鍵多平台發布”項目做得更适合自己的使用習慣,Windows端的桌面版也立項了。
本篇文章分享的内容是:實現系統右鍵菜單按鈕關聯桌面程序問題。
一、開發環境本次實現系統右鍵菜單按鈕功能,是通過Windows注冊表實現的。
1、訪問HKEY_CURRENT_USER使用HKEY_CURRENT_USER,是為了避免向用戶申請管理員權限。具體代碼如下:
//using Microsoft.Win32;
var userRegistry = Registry.CurrentUser;
當前用戶的右鍵菜單按鈕信息(僅指文件),是儲存在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);
首先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)
代碼如下:
Application.Run(new Form1(args));
為了接受參數,需要一個新的構造函數,具體代碼如下:
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);
}
}
}
static class Program
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1(args));
}
}
public partial class Form1 : Form
{
public Form1(string[] args) : this()
{
this.label1.Text = string.Join(",", args);
}
public Form1()
{
InitializeComponent();
}
}
其實個人不是很喜歡通過注冊表來實現功能,一方面是不了解注冊表,另一方面是總覺得注冊表不夠優雅。哈哈~
如果各位小夥伴有什麼其他更好的辦法,可以告訴我哦~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!