最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#關(guān)聯(lián)自定義文件類型到應用程序并實現(xiàn)自動導入功能

 更新時間:2021年09月10日 10:16:50   作者:安替-AnTi  
今天通過本文給大家分享C#關(guān)聯(lián)自定義文件類型到應用程序并實現(xiàn)自動導入功能,代碼中寫入了兩個注冊表,實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

這幾天開發(fā)遇到一個需求:

  • 將自定義文件后綴添加默認圖標雙擊
  • 自定義的文件后綴可以自動關(guān)聯(lián)到指定的應用程序并自動打開

上述第一、二兩點其實是一個需求,本質(zhì)是和注冊表有關(guān)的操作,在注冊表中寫入默認圖標、默認文件后綴、指定打開文件,一旦明白這個思路代碼就非常清晰了。

代碼中我們寫入了兩個注冊表。
第一個結(jié)構(gòu)如下圖所示,其中DefaultIcon定義的是默認圖標地址,Command中存放的是指定識別的軟件的運行exe路徑。

在這里插入圖片描述

第二個注冊表如下圖所示,將默認文件后綴和第一個注冊表進行關(guān)聯(lián),這樣就可以進行識別。

在這里插入圖片描述

添加進去之后,我們發(fā)現(xiàn)雙擊文件可以打開軟件,但是默認圖標并沒有刷新,經(jīng)過查詢,需要重啟,但這樣不是太low了嗎,難道每個用戶安裝一次軟件都要重啟嗎,這時候就需要實現(xiàn)自動對注冊表進行刷新,直接引用即可,代碼如下。

[DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);

SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero);
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Win32;
namespace AppC
{
    static class Program
    {
        /// <summary> 
        /// 應用程序的主入口點。 
        /// </summary> 
        [STAThread]
        static void Main(string[] args) 
        { 
            Application.EnableVisualStyles(); 
            Application.SetCompatibleTextRenderingDefault(false); 
 
            /// 是否通過關(guān)聯(lián)打開的軟件 
            if (args.Length > 0) 
            {
                string path="";
                for(int i=0;i<args.Length;i++)
                    path+=args[i]+" ";
                path=path.TrimEnd(' ');
                Console.WriteLine(path);
                Console.ReadKey();
                //Application.Run(new mainForm(path)); 
            }
            else 
            { 
                string keyName; 
                string keyValue; 
                keyName = "C2File"; 
                keyValue = "C2文件"; 
                RegistryKey isExCommand = null; 
                bool isCreateRegistry = true; 
 
                try 
                { 
                    /// 檢查 文件關(guān)聯(lián)是否創(chuàng)建 
                    isExCommand = Registry.ClassesRoot.OpenSubKey(keyName); 
                    if (isExCommand == null) 
                    { 
                        isCreateRegistry = true; 
                    } 
                    else 
                    { 
                        if (isExCommand.GetValue("Create").ToString() == Application.ExecutablePath.ToString()) 
                        { 
                            isCreateRegistry = false; 
                        } 
                        else 
                        { 
                            Registry.ClassesRoot.DeleteSubKeyTree(keyName); 
                            isCreateRegistry = true;                             
                        } 
                    } 
                } 
                catch (Exception) 
                { 
                    isCreateRegistry = true; 
                } 
 
                /// 假如 文件關(guān)聯(lián) 還沒有創(chuàng)建,或是關(guān)聯(lián)位置已被改變 
                //if (isCreateRegistry) 
                { 
                    try 
                    { 
                        RegistryKey key, keyico; 
                        key = Registry.ClassesRoot.CreateSubKey(keyName); 
                        key.SetValue("Create", Application.ExecutablePath.ToString()); 
 
                        keyico = key.CreateSubKey("DefaultIcon"); 
                        keyico.SetValue("", Application.ExecutablePath + ",0"); 
                        
                        /*
                        string icoFind = Path.Combine("Resources", "C2", "Icon");
                        string icoFile = Path.Combine(System.Windows.Forms.Application.StartupPath, icoFind, "Icon.ico");
                        iconKey.SetValue(String.Empty, icoFile);
                         */
 
                        key.SetValue("", keyValue); 
                        key = key.CreateSubKey("Shell"); 
                        key = key.CreateSubKey("Open"); 
                        key = key.CreateSubKey("Command"); 
 
                        /// 關(guān)聯(lián)的位置 
                        key.SetValue("", Application.ExecutablePath.ToString() + @" %1/");
 
                        /// 關(guān)聯(lián)的文件擴展名,  
                        keyName = ".c2"; 
                        keyValue = "C2File"; 
                        key = Registry.ClassesRoot.CreateSubKey(keyName); 
                        key.SetValue("", keyValue); 
                    } 
                    catch (Exception) 
                    { 
                    } 
                } 
                //Application.Run(new mainForm("")); 
            } 
        }
    }
}

但是還有一個問題,就是打包,由于我們對注冊表的寫入是寫在Main函數(shù)里的,如果用Visual Studio自帶的工具進行打包的話,也就是說每次用戶在打開軟件都會進行一次注冊表讀寫的判斷,雖然用戶不感知,但是這樣并不好。所以我們并不打算將注冊表的寫入放在Main函數(shù)中,而是使用Inno Script Studio這個工具進行美化,將注冊表的寫入放在里面,這樣用戶只會在安裝的時候?qū)懭胱员?,刪除軟件注冊表也會自動清空。

#define MyAppExeName "軟件.exe"
#define AppIconName "默認圖標路徑"

[Registry]
Root:HKCU;Subkey: "{#MyRegInstallPath_sk}" ; ValueType:string; ValueName:"{#MyRegInstallPath_vn}"; ValueData:"{app}";Flags:uninsdeletekeyifempty
Root: HKCR; Subkey: ".c2"; Flags: uninsdeletekey
Root: HKCR; Subkey: ".c2"; ValueType: string; ValueName: ""; ValueData: "C2File"
Root: HKCR; Subkey: "C2File"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\DefaultIcon"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#AppIconName}"; Flags: 
Root: HKCR; Subkey: "C2File\shell"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open\command"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName} ""%1"""; Flags:

到此這篇關(guān)于C#關(guān)聯(lián)自定義文件類型到應用程序并實現(xiàn)自動導入的文章就介紹到這了,更多相關(guān)c#應用程序自動導入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析

    C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析

    這篇文章主要介紹了C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C#基于Modbus三種CRC16校驗方法的性能對比

    C#基于Modbus三種CRC16校驗方法的性能對比

    這篇文章主要介紹了C#基于Modbus三種CRC16校驗方法的性能對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • c# 對cookies(增、刪、改、查)的操作方法

    c# 對cookies(增、刪、改、查)的操作方法

    以前覺得cookies操作無非就那么幾種,但是“杯具事件”還是很多的,下面分享一下對cookies的簡單操作
    2013-04-04
  • C#?Directory類的操作代碼

    C#?Directory類的操作代碼

    這篇文章主要介紹了C#?Directory類的操作代碼,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C# 調(diào)用 JavaWebservice服務遇到的問題匯總

    C# 調(diào)用 JavaWebservice服務遇到的問題匯總

    本文給大家分享的是個人在使用C#調(diào)用 JavaWebservice服務遇到的幾個問題的解決方法的匯總,給有類似需求的小伙伴們參考下吧。
    2016-01-01
  • WPF MVVM示例講解

    WPF MVVM示例講解

    WPF技術(shù)的主要特點是數(shù)據(jù)驅(qū)動UI,所以在使用WPF技術(shù)開發(fā)的過程中是以數(shù)據(jù)為核心的,WPF提供了數(shù)據(jù)綁定機制,當數(shù)據(jù)發(fā)生變化時,WPF會自動發(fā)出通知去更新UI,這篇文章通過示例讓大家體驗下WPF MVM,有需要的朋友可以參考下
    2015-08-08
  • C#中調(diào)用Servlet示例

    C#中調(diào)用Servlet示例

    這篇文章主要介紹了C#中調(diào)用Servlet示例,本文實現(xiàn)通用消息接口使用servlet作為服務器端服務接口,第三方應用程序通過http post的方式調(diào)用servlet,實現(xiàn)與通用消息接口的調(diào)用連接,需要的朋友可以參考下
    2015-05-05
  • C#使用Socket實現(xiàn)通信的方法示例

    C#使用Socket實現(xiàn)通信的方法示例

    這篇文章主要介紹了C#使用Socket實現(xiàn)通信的方法示例,文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫,給出方法、參數(shù)的詳細信息,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • C#遞歸實現(xiàn)回文判斷算法

    C#遞歸實現(xiàn)回文判斷算法

    這篇文章主要介紹了C#遞歸實現(xiàn)回文判斷算法,方法簡單實用,需要的朋友可以參考下
    2014-10-10
  • C#設置MDI子窗體只能彈出一個的方法

    C#設置MDI子窗體只能彈出一個的方法

    這篇文章主要介紹了C#設置MDI子窗體只能彈出一個的方法,很實用的技巧,需要的朋友可以參考下
    2014-08-08

最新評論

通道| 辛集市| 永和县| 应城市| 辰溪县| 遂川县| 三门峡市| 宜君县| 榕江县| 阳信县| 合川市| 连江县| 大庆市| 新竹市| 天峨县| 眉山市| 忻城县| 曲水县| 司法| 大足县| 金湖县| 昌宁县| 浙江省| 甘肃省| 郎溪县| 镇远县| 兴安盟| 嘉鱼县| 岗巴县| 敦化市| 南川市| 精河县| 大丰市| 开封县| 石棉县| 玛沁县| 勃利县| 芦溪县| 隆昌县| 通渭县| 西吉县|