2009-05-12 9 views
8

Tôi muốn biết khi thiết bị USB được kết nối với máy tính mà ứng dụng Qt của tôi đang chạy (trong Windows). Trong QWidget chính của tôi, tôi đã reimplemented winEventFilter như thế này:Làm thế nào để biết khi nào một thiết bị lưu trữ USB mới được kết nối trong Qt?

bool winEventFilter (MSG * msg, long * result) { 
    qDebug() << msg; 
    return false; 
} 

tôi mong đợi qDebug để gửi ít nhất một cái gì đó khi tôi kết nối một thiết bị USB, nhưng tôi không nhận được bất cứ điều gì.

Tôi đoán rằng tôi về cơ bản là hiểu sai quy trình ở đây - đây là ứng dụng Qt đầu tiên của tôi!

+1

Điều này thật thú vị! – AndreasT

+1

@AndreasT - cảm ơn! – Skilldrick

+0

Không biết nếu bạn vẫn còn có dự án này của bạn nhưng tôi đã tự hỏi (như tôi vừa mới bắt đầu học QT) nếu tôi có thể nhận được một bản sao của nó để tham khảo. Tôi không biết làm thế nào để ghi đè lên các thủ tục wndProc được nêu ra và không nhìn thấy ví dụ tốt cho nó như được nêu ra. Tôi đã không nhìn thấy những cái tốt cho nền tảng gọi cho Qt. Cảm ơn trước. –

Trả lời

5

Tôi tin rằng những gì bạn có thể bị thiếu là cuộc gọi để đăng ký thông báo thiết bị. Đây là mã mà tôi sử dụng để làm điều tương tự, mặc dù tôi ghi đè lên phương thức winEvent() của lớp QWidget và không phải là winEventFilter.

// Register for device connect notification 
DEV_BROADCAST_DEVICEINTERFACE devInt; 
ZeroMemory(&devInt, sizeof(devInt)); 
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME; 

m_hDeviceNotify = 
    RegisterDeviceNotification(winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE); 
if(m_hDeviceNotify == NULL) 
{ 
    qDebug() << "Failed to register device notification"; 
} // end if 

LƯU Ý: Bạn rất có thể sẽ cần thay đổi giá trị của DEV_BROADCAST_DEVICEINTERFACE để phù hợp với nhu cầu của mình.

EDIT: Để sử dụng mã này, bạn cần bao gồm các tệp tiêu đề thích hợp và thực hiện thiết lập phù hợp. DEV_BROADCAST_DEVICEINTERFACE yêu cầu tiêu đề Dbt.h được bao gồm. Ngoài ra, tiêu điểm của mã này là trên chức năng RegisterDeviceNotification. Thông tin có sẵn trên MSDN

+0

Xin lỗi vì đã câm, nhưng tôi không thể tạo công việc DEV_BROADCAST_DEVICEINTERFACE (lỗi: 'DEV_BROADCAST_DEVICEINTERFACE 'không được khai báo trong phạm vi này). Tôi có cần thêm các tệp tiêu đề phụ không? – Skilldrick

+0

Đừng xin lỗi. Tôi đã có một thời gian khó khăn để tìm ra rất nhiều điều này. Hy vọng rằng chỉnh sửa của tôi sẽ cung cấp cho bạn một số hướng về cách sử dụng mã tôi đã cung cấp. Nó vẫn có thể không được hoàn thành mặc dù. Tôi đưa liên kết đến MSDN để cung cấp cho bạn một nguồn để biết thêm thông tin. Nếu tôi có nhiều thời gian hơn, tôi sẽ cố gắng hướng dẫn bạn cách thực hiện nó. Điều này thực sự ít nhất phải nhận được các tin nhắn để xử lý của bạn. – brader24

-1

Liên kết này đến Trolltech mailing list có thể hữu ích.

+0

Tôi thấy rằng thông qua Google, nhưng phải trung thực nó nhầm lẫn tôi! Tôi không thể tin được rằng câu hỏi tôi yêu cầu c. 150 dòng mã (là giải pháp được chấp nhận trong chuỗi đó). Cảm ơn mặc dù. – Skilldrick

+2

Đối với tất cả những người đến đây, liên kết đó đã chết. –

+0

Chết tiệt! liên kết là chết thực sự, bất kỳ cập nhật? – Xsmael

2

Tôi đang làm việc cùng các dòng nhưng trong C#.

bạn cần đăng ký ứng dụng của mình với hệ thống (xem chức năng RegisterHidNotification()). Mỏ trông giống như sau: `

void RegisterHidNotification() //Register this application to recieve all USB device notices 

     { 
      BroadcastHeader dbi = new BroadcastHeader(); 
      int size = Marshal.SizeOf(dbi); 
      dbi.Size = size; 
      dbi.Type = DeviceType.DeviceInterface; 
      **dbi.Classguid = GUID_DEVINTERFACE_USB_DEVICE**; 
      dbi.Name = 0; 
      IntPtr buffer = Marshal.AllocHGlobal(size); 
      Marshal.StructureToPtr(dbi, buffer, true); 
      IntPtr r = RegisterDeviceNotification(this.Handle, buffer, (int)DeviceEvents.regWindowHandle); 
      if (r == IntPtr.Zero) 
       statusLabel.Text = GetLastError().ToString(); 
     }` 

Phần quan trọng nhất của hàm là bit tôi đã tô đậm (hoặc ít nhất là cố). Được định nghĩa là: public Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED"); Hy vọng bạn có thể điều chỉnh nó cho ứng dụng của mình.