
Đóng m khay CD trong .NETở
C p nh t: ậ ậ 26/8/2008 v i ớ no comments
X p trong: ếL p trìnhậ, C#, Application
Bài vi t này s d y b n cách m và đóng khay CD/VCD b ng C# s d ng winmmế ẽ ạ ạ ở ằ ử ụ
DLL và các cu c g i mã không qu n v i PInvoke. Microsoft .NET Framework khôngộ ọ ả ớ
cung c p ph ng th c nào đ b n có th đ n gi n trong vi c g i m hay đóng khayấ ươ ứ ể ạ ể ơ ả ệ ọ ở
CD/DVD c a các đĩa...ủ ổ
Bài vi t này s d y b n cách m và đóng khay CD/VCD b ng C# s d ng winmmế ẽ ạ ạ ở ằ ử ụ
DLL và các cu c g i mã không qu n v i PInvoke.ộ ọ ả ớ
Microsoft .NET Framework không cung c p ph ng th c nào đ b n có th đ n gi nấ ươ ứ ể ạ ể ơ ả
trong vi c g i m hay đóng khay CD/DVD c a các đĩa máy tính. Tuy nhiên, đi u đóệ ọ ở ủ ổ ề
không có nghĩa là v n đ đ a ra không th d dàng th c hi n đ c b ng cách s d ngấ ề ư ể ễ ự ệ ượ ằ ử ụ
mciSendString t Windows API. Bài vi t này đ c vi t v i Visual Studio 2005, nh ngừ ế ượ ế ớ ư
nó cũng ch y t t c v i Visual Studio 2003.ạ ố ả ớ
Kh i đ ng m t project C# Window Application. Kéo 2 nút đ a lên form, btnOpen vàở ộ ộ ư
btnClose, chúng s m và đóng khay CD/DVD khi đ c click.ẽ ở ượ
Bây gi chúng ta hãy chuy n sang ch đ code và thêm ti n ch th sau vào, b i vìờ ể ế ộ ề ỉ ị ở
chúng ta s làm vi c v i mã không qu n.ẽ ệ ớ ả
view plain print ?
1.
2. using System.Runtime.InteropServices;
Trong class (th ng là contructor trên), s d ng hai dòng mã sau đây. Chúng s g iườ ở ử ụ ẽ ọ
đ n file DLL winmm.dll vào mã ngu n c a chúng ta, s d ng c ch có tên là PInvoke.ế ồ ủ ử ụ ơ ế
DLL này (winmm.dll) đ c đ t trong th m c System32 c a Windows. Hàmượ ặ ư ụ ủ
mciSendString đ c s d ng đ g i đi m t chu i câu l nh đ n thi t b MCI, trongượ ử ụ ể ử ộ ỗ ệ ế ế ị
tr ng h p này là đĩa CD/DVD.ườ ợ ổ
view plain print ?
1.
2. [DllImport("winmm.dll")]
3. static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bu
fferSize, IntPtr hwndCallback);

Bây gi chúng ta quay tr l i form, nh n đúp chu t vào nút Open (btnOpen) đ nh nờ ở ạ ấ ộ ể ậ
đ c handler cho s ki n Click. Trong handler này chúng ta vi t mã sau:ượ ự ệ ế
view plain print ?
1.
2. mciSendString("set CDAudio door open", null, 0, IntPtr.Zero);
Chúng ta đã g i câu l nh set CDAudio door open t i thi t b MCI ( đĩa CD/DVD ).ử ệ ớ ế ị ổ
B n có th ch y ng d ng luôn b ng cách nh n nút và ch cho khay đ c m ra.ạ ể ạ ứ ụ ằ ấ ờ ượ ở
Bây gi b n có th mu n bi t làm th nào đ đòng khay l i. Hãy quay l i form, nh nờ ạ ể ố ế ế ể ạ ạ ấ
đúp chu t vào nút Close (btnClose) và dùng hàm sau đ g i t i đĩa câu l nh setộ ể ử ớ ổ ệ
CDAudio door closed.
view plain print ?
1.
2. mciSendString("set CDAudio door closed", null, 0, IntPtr.Zero);
Sau khi biên d ch và ki m tra ng d ng C# này, b n có th m và đóng khay đĩa c aị ể ứ ụ ạ ể ở ủ
các đĩa r i, và đó ch làm b i m t vài dòng mã l nh.ổ ồ ỉ ở ộ ệ
Tôi bi t nhi u b n s đang nghĩ đ n câu h i lúc này là:" Tôi có nhi u đĩa CD/DVDế ề ạ ẽ ế ỏ ề ổ
và ch mu n m t trong s chúng đ c m . Làm th nào ta có th ch n m t nhỉ ố ộ ố ượ ở ế ể ọ ộ ổ ư
v y?".ậ
Các câu l nh g i trên, ch là m /đóng đĩa đ c đánh d u nh là các đĩa m c đ nhệ ử ở ỉ ở ổ ượ ấ ư ổ ặ ị
đ ch y các CDs audio. Đ m các đĩa khác, chúng ta c n ch ra ch cái tên màể ạ ể ở ổ ầ ỉ ữ ổ
chúng ta mu n m là đ c. N u nh b n có hai đĩa DVD -H và -I, thay đ i l i đo nố ở ượ ế ư ạ ổ ổ ạ ạ
mã chúng ta vi t lúc nãy trong các handler c a s ki n click vào nút b i mã:ế ủ ự ệ ở
view plain print ?
1.
2. // Open Drive H:
3. mciSendString("open H: type CDAudio alias driveH", null, 0, IntPtr.Zero);
4. mciSendString("set driveH door open", null, 0, IntPtr.Zero);
5. // Open Drive I:
6. mciSendString("open I: type CDAudio alias driveI", null, 0, IntPtr.Zero);
7. mciSendString("set driveI door open", null, 0, IntPtr.Zero);

Đ u tiên chúng ta t o ra tên bí danh cho đĩa H tên là driveH, nh là m t ki uầ ạ ổ ư ộ ể
CDAudio c a đĩa, ti p đ n trong câu l nh th hai, chúng ta m nó b ng cách ch raủ ổ ế ế ệ ứ ở ằ ỉ
bí danh thay vì CDAudio. Cách làm cũng s t ng t v i đĩa I.ẽ ươ ự ớ ổ
Câu l nh sau đây cho tât c đĩa minh h a nh sau:ệ ả ổ ọ ư
view plain print ?
1.
2. // Close Drive H:
3. mciSendString("open H: type CDAudio alias driveH", null, 0, IntPtr.Zero);
4. mciSendString("set driveH door closed", null, 0, IntPtr.Zero);
5. // Close Drive I:
6. mciSendString("open I: type CDAudio alias driveI", null, 0, IntPtr.Zero);
7. mciSendString("set driveI door closed", null, 0, IntPtr.Zero);
Ch c n tùy bi n đo n mã này m t chút, b n có th s d ng các dòng bí danh m t l n,ỉ ầ ế ạ ộ ạ ể ử ụ ộ ầ
b ng cách g i chúng trong s ki n Load c a form, và ti p đ n ch vi c g i các câuằ ọ ự ệ ủ ế ế ỉ ệ ọ
l nh open door/close door trong các handler c a các nút đó.ệ ủ