Сам спрашиваю, сам отвечаю
Короче надо зарегистрировать сообщение "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"