Áp dụng icon cho các file có đuôi mở rộng do chương trình tạo ra trong C#

Khi mới bắt đầu đi vào lập trình Windows Form với ngôn ngữ C#. Ta không khỏi thắc Áp dụng icon cho các file có đuôi mở rộng do chương trình tạo ra trong C#mắc rằng tại sao những file .doc, .xls, .rar… lại có icon giống với icon của chương trình. Những file có đuôi mở rộng mới do chương trình chúng ta tự tạo ra sẽ mặc định có icon là một trang giấy trắng. Trước đây tôi cũng từng thắc mắc về vấn đề này. Và giờ đây tôi viết bài viết này để chia sẽ cách mình đã làm.

 

 

 

1. Tạo Windows From Application project mới và add thư viện cần sử dụng.

-  Đầu tiên bạn tạo project windows form application như bình thường.

-  Copy file CustomFileExtensionControl.dll vào thư mục bin\Debug của project.

-  Click chuột phải vào project trong thanh Solution Explorer chọn Add Reference

image

-  Rồi add vào file CustomFileExtensionControl.dll thiết sử dụng trong chương trình.

image

-  Giờ thì trong code của chương trình ta khai báo sử dụng thư viện vừa add vào:

using CustomFileExtensionControl;

    Ngoài ra chúng ta còn phải khai báo thêm 2 using sau đây:

using System.IO;
using System.Runtime.InteropServices;

2. Nguyên tắc thực hiện của chương trình

-  Chương trình thực hiện việc đăng ký đuôi mở rộng chương trình của bạn trong regedit trong khóa HKEY_CLASSES_ROOT. (Có thể tìm hiểu thêm về cách đọc và ghi regedit với C# ở đây)

Việc thực hiện của chương trình giống như việc sử dụng open with rồi chọn chương trình cần mở file đó trong Windows Explorer.

image

-  Vì bài viết này chỉ tập trung vào việc giải quyết vấn đề áp dụng icon cho đuôi mở rộng của chương trình. Do dó tôi sẽ không giải thích dài dòng mà chỉ tập trung vào việc sử dụng làm sao cho chúng ta có thể thực hiện một cách nhanh chóng trong code của chương trình bằng cách sử dụng một thư viện đã được build sẵn. Ở cuối bài viết tôi sẽ cung cấp source code của thư viện này.

3. Source code chương trình

-  Đầu tiên để chương trình thực hiện được những tính năng nói trên. Trong Windows 7 chương trình cần một yêu cầu chạy với quyền Admin, nếu không chương trình sẽ báo lỗi.  Việc thực hiện bạn có thể tham khảo bài viết ở đây.

-  Và đây là source code chính của chương trình:

Chương trình này sẽ áp dụng cho những file có đuôi mở rộng  là:  .thanhcuong

using System.IO;
using System.Runtime.InteropServices;
using CustomFileExtensionControl;

namespace Embed_Icon_File_Extension
{
    public partial class Form1 : Form
    {
        CustomFileExtensionControl.App app1 = new CustomFileExtensionControl.App();
        CustomFileExtensionControl.App app2 = new CustomFileExtensionControl.App();
        CustomFileExtension customFileExtension1 = new CustomFileExtension();

        private const int WM_COPYDATA = 0x4A;

        struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        public Form1()
        {
            InitializeComponent();
            this.MaximizeBox = false;
            this.StartPosition = FormStartPosition.CenterScreen;

            customFileExtension1.ApplicationName = "Embed Icon File Extension.exe";
            customFileExtension1.Description = "THANHCUONG\'s file";
            customFileExtension1.EmbeddedIcon = false;
            customFileExtension1.Extension = ".thanhcuong"; // đuôi file mở rộng là ".thanhcuong"
            customFileExtension1.Handler = "thanhcuong.wordpress.com";
            customFileExtension1.IconName = "tree.ico";  // File icon cho đuôi mở rộng cần hiển thị.
            customFileExtension1.IconPosition = 0;
            customFileExtension1.OpenText = "Open me this instant";
            app1.AppPath = "C:\\Users\\Administrator\\Desktop\\ThanhCuong.exe";   // Add ứng dụng vào menu openwith
            app2.AppPath = "C:\\Users\\Administrator\\Desktop\\ThanhCuong.exe";
            this.customFileExtension1.OpenWith.Add(app1);
            this.customFileExtension1.OpenWith.Add(app2);
        }

        public Form1(string[] args)
        {
            InitializeComponent();
            OpenFile(args);
        } 

        FileStream fs;
        StreamReader sr;

        private void OpenFile(string[] args)
        {
            for (int i = 0; i < args.Length; i++)
            {
                fs = new FileStream(args[i], FileMode.Open);
                sr = new StreamReader(fs);

                MessageBox.Show(sr.ReadToEnd());
            }

            fs.Close();
            fs.Dispose();
            sr.Close();
            sr.Dispose();
        }

        private void btnInstall_Click(object sender, EventArgs e)
        {
            customFileExtension1.RegisterFileType();
        }

        private void btnUninstall_Click(object sender, EventArgs e)
        {
            customFileExtension1.RemoveFileType();
        }

        protected override void WndProc(ref Message message)
        {
            if (message.Msg == WM_COPYDATA)
            {
                COPYDATASTRUCT mystr = (COPYDATASTRUCT)message.GetLParam(typeof(COPYDATASTRUCT));
                Type mytype = mystr.GetType();
                mystr = (COPYDATASTRUCT)message.GetLParam(mytype);

                string[] args = customFileExtension1.GetData(mystr.lpData);

                OpenFile(args);
            }
            base.WndProc(ref message);
        }
    }
}

4. Kết quả chương trình Demo

-  Giao diện chương trình:

image

-  Chương trình sẽ tiến hành áp dụng icon có hình cây thông như hình trên cho các file có đuôi mở rộng là .thanhcuong, và cũng có thể gở bỏ áp dụng này.

-  Khi thực thi chương trình sẽ yêu cầu chạy với quyền Admin. Nếu như bạn Debug từ visual studio, thì phải chạy visual studio với quyền admin thì chương trình mới có thể thực hiện việc ghi vào regedit được.

-  Và đây là kết quả thực thi chương trình khi áp dụng icon cho file .thanhcuong

image

-  Kết quả sau khi gở bỏ áp dụng icon đối với file .thanhcuong

image

5. Source code demo

Click vào đây để download source code demo chương trình áp dụng icon cho đuôi mở rộng của chương trình viết trên visual studio 2010 (C#).

Click vào đây để download source code thư viện CustomFileExtensionControl.dll viết trên visual studio 2010 (C#).

Chúc thành công!