Drupal Consultant
Started my career as a drupal8 developer in EM Solutions . I love learning Web technologies like HTML, CSS, PHP, Jquery Ajax and Drupal backend . Currently working as a drupal backend developer.
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 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
- Rồi add vào file CustomFileExtensionControl.dll thiết sử dụng trong chương trình.
- 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.
- 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:
- 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
- Kết quả sau khi gở bỏ áp dụng icon đối với file .thanhcuong
5. Source code demo
Chúc thành công!