Tôi đang giao tiếp với cổng nối tiếp USB có thể được chèn vào hoặc xóa bất kỳ lúc nào. Tôi đã tìm thấy rằng tôi có thể sử dụng WMI (đặc biệt với việc sử dụng WMI Code Creator) để truy vấn các thay đổi thiết bị trong PC.Phát hiện chèn/xóa cổng nối tiếp
Trong đoạn mã được tạo bên dưới, Win32_DeviceChangeEvent được đăng ký. Tuy nhiên, sự kiện này không tiết lộ thiết bị nào (ví dụ: USB, cổng nối tiếp, v.v.) đã gây ra sự kiện. Có cách nào để chỉ nhận thông báo khi các cổng nối tiếp được chèn vào hoặc bị xóa không?
Để làm rõ, điểm của mã là không để phát hiện mở/đóng của cổng nối tiếp, nó là để phát hiện xem một cổng mới đã được thêm vào máy hoặc một cổng trước được loại bỏ.
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class WMIReceiveEvent
{
public WMIReceiveEvent()
{
try
{
WqlEventQuery query = new WqlEventQuery(
"SELECT * FROM Win32_DeviceChangeEvent");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived +=
new EventArrivedEventHandler(
HandleEvent);
// Start listening for events
watcher.Start();
// Do something while waiting for events
System.Threading.Thread.Sleep(10000);
// Stop listening for events
watcher.Stop();
return;
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
Console.WriteLine("Win32_DeviceChangeEvent event occurred.");
}
public static void Main()
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
return;
}
}
}
Xin chào, tôi đã cố gắng sử dụng mã này và tôi thấy rằng phần xóa không phải là tốt nhất bạn có thể nhận được. Khi ứng dụng có kết nối với thiết bị và bạn ngắt kết nối cáp, mã của bạn sẽ nhận thấy điều này. Tuy nhiên, bạn không thể thấy bất kỳ thay đổi nào vì chương trình đã không dọn sạch các cổng và 'GetPortNames' sẽ trả về phần mềm không còn khả dụng nữa. Tôi chỉ quan tâm đến sự kiện xóa, vì vậy tôi đang kiểm tra xem 'SerialPort' có đang mở hay không. Nếu cổng bị đóng, sự kiện xóa đã xảy ra. – 2pietjuh2
@ 2pietjuh2 Nếu tôi hiểu bạn, bạn đã đúng. Điểm của mã không phải là để phát hiện mở/đóng cổng nối tiếp, nó là để phát hiện xem một cổng * mới * đã được thêm vào máy hay cổng trước đã được * gỡ bỏ *. Vì vậy, nó có thể được rằng bạn đang tìm kiếm một vấn đề khác nhau? – Pat
Bạn có thể giải thích eventtype 2 và 3 là gì và các loại sự kiện khác tồn tại? –