Кто знает как определить момент появления flash-карты (SD/MMC/MS/...) в картридере. Писать мол смотри в сторону WM_DEVICECHANGE не надо ибо при установке карты такое сообщение не приходит. Я смог отловить сообщение WM_DDE_INITIATE, которое посылается моему приложению в момент появления карты, но ведь есть что-то еще
Помогите пожалуйста!!!
Подписываюсь на получение сообщений от интерфейса GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }};
Может нужен другой интерфейс? хотя GUID_DEVCLASS_VOLUME тоже не помог. кстати после установки драйвера на картридер сообщение WM_DDE_INITIATE перестало приходить
Сам спрашиваю, сам отвечаю
Короче надо зарегистрировать сообщение "QueryCancelAutoPlay"
//...
UINT g_uQueryCancelAutoPlay = ::RegisterWindowMessage(_T("QueryCancelAutoPlay"));
//...
А затем в обработчике проверять. При вставке карточки вы обязательно получите его при условии, что ваше приложение на переднем плане
[msdn]
Microsoft® Windows® sends a "QueryCancelAutoPlay" message to the foreground window
[/msdn]
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// MSDN: "Enabling and Disabling AutoRun"
if (message && (message == g_uQueryCancelAutoPlay)) {
// wParam - опытным путем выянил, что равен № диска в системе по счету, т.е. A=1, C=2,...
// lParam - всегда = 0x40 пока не выяснил что это означает
ATLTRACE(_T("message = \"QueryCancelAutoPlay\" (code=%d), wParam=0x%x, lParam=0x%x, drice=%c\n"), g_uQueryCancelAutoPlay, wParam, lParam, FirstDriveFromMask(1 << (ULONG)wParam));
//SetWindowLong(hDlg, DWL_MSGRESULT, TRUE); // use this line for DlgProc
return TRUE; // cancel auto-play
}
switch (message) {
//...
}
return 0;
}
Обо всем этом подробнее можно прочитать в MSDN: "Enabling and Disabling AutoRun"