2010-03-10 23 views
5

Tôi hiện đang sử dụng WM_DEVICECHANGE để được thông báo khi ổ đĩa USB mới được kết nối với máy tính. Điều này làm việc tuyệt vời cho các thiết bị như ổ đĩa nhỏ, ngay khi thiết bị đến, nó đã sẵn sàng để đọc các tập tin từ nó. Đối với các thiết bị như đầu đọc thẻ SD, không phải vì tin nhắn được gửi đi một lần khi thiết bị được kết nối nhưng không có tin nhắn nào được gửi khi người dùng thực sự chèn thẻ vào thiết bị.Phát hiện chèn phương tiện vào ổ đĩa bằng cách sử dụng thông báo trên cửa sổ

Có thể phát hiện việc chèn phương tiện mới vào thiết bị USB hiện có mà không phải sử dụng bỏ phiếu không?

+0

Kiểm tra câu hỏi này http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in –

+2

@Kirill: có một lý do chính đáng mà câu hỏi có không có câu trả lời được chấp nhận. Họ không phân biệt giữa "ổ đĩa mới" và "chèn khối lượng trong ổ đĩa hiện tại". – MSalters

Trả lời

8

Tôi vừa làm điều này một vài tuần trước. Về mặt kỹ thuật, tuyến đường RegisterDeviceNotification là một cách thích hợp để đi, nhưng nó đòi hỏi một lượng công việc phù hợp để có được quyền. Tuy nhiên, Windows Explorer đã làm tất cả các công việc khó khăn cho bạn. Chỉ cần sử dụng SHChangeNotifyRegister với SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED. Lưu ý rằng phương pháp này phụ thuộc vào dịch vụ Phát hiện phần cứng Shell (hoặc bất kỳ dịch vụ nào được gọi), nhưng nó dễ dàng hơn nhiều so với việc cố gắng tự thực hiện lại chức năng đó.

+0

Cuộc gọi tốt. Thư viện triển khai thực hiện trên mỗi hệ thống. Nhưng cài đặt đăng ký DisableAutorunDriveType có ảnh hưởng đến điều đó không? –

+0

Tôi đã không kiểm tra điều đó, nhưng tôi không nghĩ rằng cả hai được kết nối. Cơ chế này được sử dụng bởi ứng dụng khay "Remove Hardware Safely"; ngay cả khi tự động tắt bị vô hiệu hóa, ứng dụng khay đó vẫn cần nhận thông báo đến/xóa. – Luke

+3

Tin nhắn SHCNE_MEDIAINSERTED đang được gửi ngay cả khi cài đặt đăng ký DriveTypeAutoRun được đặt để tắt tất cả thiết bị. – rjschnorenberg

0

Có thể là lỗi trong trình điều khiển trình đọc SD. Mô tả trong WM_DEVICECHANGE là "DBT_DEVICEARRIVAL 0x8000 Một thiết bị hoặc một phần phương tiện đã được chèn và hiện đã có sẵn".

Vì vậy, bạn được yêu cầu nhận thông báo cho phương tiện chèn.

Bạn đã thử sử dụng RegisterDeviceNotification? Chỉ một số thông báo được gửi theo mặc định và thay đổi phương tiện có thể không phải là một trong số các thông báo đó.

+0

Vì nó xảy ra, thông báo khối lượng mới được gửi theo mặc định. – MSalters

+0

Phải, nhưng ký tự ổ đĩa (âm lượng) được gán khi đầu đọc thẻ được lắp vào.Thông báo thay đổi phương tiện có thể yêu cầu RegisterDeviceNotification. –

0

Có lẽ nó là một lỗi trong trình điều khiển thiết bị (tôi chắc chắn nghĩ nó là), nhưng tất cả đều xuất hiện để làm việc trong cùng một cách ... KHÔNG. Vì vậy, tại thời điểm này, tôi không nghĩ rằng bạn có thể nhận được bất kỳ trình điều khiển thiết bị nào để thay đổi đặc tính thiết bị của họ ngay cả khi Microsoft (có thể là nhà phát triển lớn nhất) dẫn bạn tin rằng nó sẽ hoạt động theo cách này (Không hoạt động cho trình điều khiển Windows7 của tôi). Việc chèn thẻ SD vào thiết bị USB chỉ đơn giản là không kích hoạt tin nhắn WM_DEVICECHANGE.

Sử dụng SHChangeNotifyĐăng ký cho thiết bị loại phương tiện. Nó không yêu cầu một đăng ký devicenotification. Và bạn có thể lấy ký tự ổ đĩa qua SHGetPathFromIDList. Sử dụng SHCNE_MEDIAINSERTED và SHCNE_MEDIAREMOVED.

Sử dụng thiết bị ONDeviceNotify nếu bạn đang tìm thiết bị phần cứng thay vì thiết bị truyền thông hoặc bạn có thể viết trình điều khiển thiết bị của riêng bạn.

Xem của nhận xét này đang CodeProject - Trapping windows messages

2

Có một ví dụ rất tốt về việc sử dụng SHChangeNotifyRegister trong "thay đổi thông báo Watcher mẫu". Tải về nó từ địa chỉ này:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

tôi thực hiện SHChangeNotifyRegister trong mã Qt của tôi.

Cảm ơn Luke vì câu trả lời rất hay của anh ấy!

+0

Tôi khá mới - khi nói đến việc trộn và triển khai mã Windows (những thứ như SHChangeNotifyRegister) với mã Qt. Bạn có thể cho tôi một số hướng dẫn làm thế nào để tiến hành với điều này? Bất kỳ trợ giúp được đánh giá cao !! – zeFree

Các vấn đề liên quan