Đó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
Trang 1Đó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);
Trang 2Bâ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 ?
Trang 31
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 đó