Breaking News
Loading...
Wednesday, August 22, 2012

Tương tác với System Registry trong C#

8/22/2012 10:37:00 PM
Nếu là dân lập trình COM, chắc hẳn bạn không thể tránh khỏi sự khốn khổ khi lập trình với Registry của Windows . Còn nếu bạn sống chung với VS.NET rất ư là thưa thớt, .NET Framework đã giảm sự quan trọng của Registry đối với ứng dụng, vì assembly đã trở...
Nếu là dân lập trình COM, chắc hẳn bạn không thể tránh khỏi sự khốn khổ khi lập trình với Registry của Windows. Còn nếu bạn sống chung với VS.NET rất ư là thưa thớt, .NET Framework đã giảm sự quan trọng của Registry đối với ứng dụng, vì assembly đã trở thành “tự cung tự cấp” do đó assembly không cần thông tin đặc biệt được trữ trên RegistryRegistry giờ đây chỉ nơi tiện lợi để bạn lưu trữ thông tin về sở thích của người sử dụng.
Namespace Microsoft.Win32

Namespace Microsoft.Win32 định nghĩa một vài lớp cho phép đọc/viết registry một cách dễ dàng. Sau đây là các lớp trong namespace này:
-Registry: Một trừu tượng hóa cấp cao về bản thân Registry, với tất cả các lớp được gắn liền
-RegistryKey : Đây là lớp cốt lõi cho phép bạn thêm vào, gỡ bỏ và nhật tu thông tin được trữ trong Registry
-RegistryHive: Đây chỉ là mỗi khuôn tổ ong (hive) trên Registry
Trước khi đi vào việc tương tác với Registry qua C#, bạn cũng nên biết qua chút ít về Registry trong Windows:
Để mở Registry: nhấn menu Start trên thanh taskbar, sau đó chọn Run, ở hộp thoại Run vừa hiện ra, gõ vào regedit.
HKEY_CLASSIES_ROOT (HKCR): chứa những chi tiết về các loại tập tin (.txt,.doc,…) và những ứng dụng nào đó có khả năng mở các tập tin loại nào. Ngoài ra, nó còn chứa những thông tin đăng ký đối với tất cả các cấu kiện COM
HKEY_CURRENT_USER (HKCU): chứa những chi tiết liên quan đến những sở thích của người sử dụng hiện được đăng nhập trên máy tính.
HKEY_LOCAL_MACHINE (HKLM): là một hive đồ sộ chứa những chi tiết của tất cả các phần mềm và phần cứng được cài đặt trên máy. Nó cũng bao gồm HKCR hive: HKCR hiện thật sự không phải là 1 hive độc lập tự thân, nhưng đơn giản là một ánh xạ tiện lợi trên Registry key.
HKEY_USERS (HKUSR): chứa những chi tiết liên quan đến sở thích của tất cả các người sử dụng. Như bạn có thể chờ đợi, nó cũng chứa hive HKCU, đơn giản là 1 ánh xạ lên 1 trong những key trên HKEY_USERS
HKEY_CURRENT_CONFIG
: chứa những chi tiết liên quan đến phần cứng trên máy tính.
Các lớp.NET Registry

Việc truy cập vào Registry trên .NET sẽ thông qua 2 lớp Registry và RegistryKey thuộc namespace Microsoft.Win32. Một thể hiện của lớp Registry Key tượng trưng cho một registry key. Lớp RegistryKey cung cấp những thành viên cốt lõi sau đây cho phép bạn làm việc với một registry key:
-Name: thuộc tính này tìm lại tên của key (read-only)
-SubKeyCount: thuộc tính này tìm lại bộ đếm số lượng subkey
-ValueCount: tìm lại bộ đếm các giá trị trên một key
-Close(): hàm này cho đóng lại key, và ghi lên đĩa cứng nếu nội dung bị thay đổi
-CreateSubKey(): hàm này tạo 1 subkey mới hoặc mở 1 subkey hiện hữu. Chuỗi subkey không phân biệt chữ hoa, chữ thường.
-DeleteSubKey(): hàm này cho gỡ bỏ 1 subkey được chỉ định. Nếu muốn gỡ bỏ những subkey con thì sử dụng đến DeleteSubKeyTree(). Chuỗi subkey không phân biệt chữ hoa, chữ thường
-GetSubKeyNames(): hàm này cho tìm lại mảng chứa tất cả các tên của subkey
-GetValue(): hàm này tìm lại trị được khai báo.
-GetValueNames(): hàm này cho tìm lại 1 bản dãy chuỗi chữ chứa tất cả các tên trị (value name)
-OpenRemoteBaseKey(): hàm này cho mở 1 RegistryKey mới tượng trưng cho key được yêu cầu trên một máy nằm ngoài.
-OpenSubKey(): hàm này cho tìm lại SubKey()
-SetValue(): hàm này cho đặt để 1 trị được chỉ định. Chuỗi subkey không phân biệt hoa thường.
Lớp RegistryKey

Lớp RegistryKey là lớp mà chúng ta sẽ dùng để làm việc với registry. Bài viết này sẽ đi sâu vào lớp này. Đầu tiên, muốn có 1 thể hiện của 1 RegistryKey, tượng trưng cho key HKEY_LOCAL_MACHINE , bạn viết:

[PHP]RegistryKey Hklm = Registry.LocalMachine;[/PHP]


Như bạn đã thấy, đối tượng Hklm đơn giản là đang trỏ tới khóa HKEY_LOCAL_MACHINE (HKLM) trong Registry. Cũng không có gì khó hiểu, chúng ta qua bước nữa nhé. Bây giờ, nếu bạn muốn đọc 1 vài dữ liệu trên HKEY_LOCAL_MACHINE\Software\Microsoft, bạn phải lấy qui chiếu về key như sau:

[PHP]RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey(“Software”);
RegistryKey HkMicrosoft = HkSoftware.OpenSubkey(“Microsoft”); [/PHP]


Hàm hành sự OpenSubKey() là 1 trong những hàm bạn sẽ triệu gọi nếu bạn chờ đợi key hiện hữu. Nếu nó không có, thì nó sẽ trả về một null reference. Còn nếu bạn muốn tạo 1 key mới, bạn sẽ dùng hàm CreateSubKey() (hàm này tự động cho quyền Read-Write):

[PHP]RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey(“Software”);
RegistryKey HkMine = HkSoftware.CreateSubKey(“Phan mem cua toi”);[/PHP]

Như thế là chúng ta đã có có khóa mang tên “Phan mem cua toi” trong HKEY_LOCAL_MACHINE\Software rồi đấy.
Điều thông thường xảy ra là ứng dụng của bạn cần bảo đảm là 1 vài dữ liệu hiện diện trong Registry – nói cách khác là tạo ra những key mang ý nghĩa nếu chúng chưa hiện diện, nhưng không làm gì cả nếu chúng hiện diện. CreateSubkey() đáp ứng đúng nhu cầu này.
Một khi bạn đã có Registry key, bạn muốn đọc hoặc thay đổi, bạn có thể sử dụng hàm SetValue() hoặc GetValue() để đặt thuộc đi lấy dữ liệu trên Key. Thí dụ:

[PHP]RegistryKey HkMine = HkSoftware.CreateSubkey(“Phan mem cua toi”);
HkMine.SetValue(“Ma so dang ky”, “Hello World”);
HkMine.SetValue(“So hieu”, 33);

Đoạn mã trên sẽ đặt key về 2 giá trị: “Ma so dang ky” sẽ mang kiểu dữ liệu REG_SZ, trong khi “So hieu” sẽ mang kiểu dữ liệu REG_DWORD (ở đây giá trị của nó = 33)
RegistryKey.GetValue() hoạt động cũng như vậy, nó được định nghĩa trả về 1 quy chiếu đối tượng, nghĩa là trả về 1 qui chiếu string nếu nó thấy có kiểu dữ liệuREG_SZ và một int nếu phát hiện kiểu dữ liệu REG_DWORD:

[PHP] string StringValue = (string) HkMine.GetValue(“Ma so dang ky”);
int sohieu = (int) HkMine.GetValue(“So hieu”);
[/PHP]
Khi đã thao tác xong với registry, bạn nhớ là phải cho đóng lại
HkMine.Close();

Ví dụ

Bây giờ, chúng ta thực hiện một ứng dụng nho nhỏ, chúng ta thử xây dựng 1 ứng dụng Windows Forms, trong đó có chứa 1 button để save trạng thái của Form chính, trong đó Form chính còn chứa thêm các thuộc tính như màu sắc, font chữ,… Chẳng hạn nhé, chúng ta có 1 chương trình, người dùng mở lên, thao tác “tá lả âm binh” trên đó như thay đổi màu sắc phông chữ, thay đổi màu nền,… sau đó họ thoát ra, và bạn phải làm sao để lúc họ mở lại, những thay đổi của người dùng không bị biến mất. Làm sao đây? Đây là lúc chúng ta sử dụng đến “RegistryKey” vừa quen biết.
Giả sử, chúng ta đã xây dựng Form xong rồi nhé, và có đầy đủ các thuộc tính, hãy thử phá Form này thoải mái.Yeah, ok. Xong! Bây giờ chúng ta dùngRegistry.SetValue() để lưu lại mấy cái phá hoại của người đó.
[PHP] private void FileSave_Cliked(object sender, EventArgs e) // tình huống clicked của button Saved
{
RegistryKey regKey = Registry.CurrentUser;
regKey = regKey.CreateSubkey(“Software\\C#\\UngDung”);
regKey.SetValue(“CurrSize”,currFontSize);
regKey.SetValue(“CurrColor”,currColor.Name);
}


Nếu bây giờ người sử dụng cho màu hiện hành về màu Blue và kích thước Font chữ là 30. Thì những thông tin này sẽ được lưu trongHKEY_CURRENT_USER\Software\C#\UngDung
Vậy là xong phần lưu thông tin, bây giờ giải quyết việc đọc thông tin đã lưu bằng cách dùng hàm GetValue(). Cụ thể như đoạn code dưới đây:
 RegistryKey regKey = Registry.CurrentUser;
regKey = regKey.CreateSubkey(“Software\\C#\\UngDung”);
//đọc vào dữ liệu rồi gán cho biến tình trạng
currFontSize = (int) regKey.GetValue(“CurrSize”,currFontSize);
string c = (string) regKey.GetValue(“CurrColor”,currColor.Name);
currColor = Color.FromName( c );
BackColor = currColor;

0 comments:

Post a Comment

 
Toggle Footer