#include <windows.h>
// Función de callback para el cambio de hardware
BOOL CALLBACK HardwareChangeCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
if (lpParameter != NULL)
{
PDEV_BROADCAST_HDR pBroadcastHdr = (PDEV_BROADCAST_HDR)lpParameter;
if (pBroadcastHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pVolume = (PDEV_BROADCAST_VOLUME)pBroadcastHdr;
// Verificar si el evento es por la remoción de un CD
if (pVolume->dbcv_flags & DBTF_MEDIA)
{
// Realizar las acciones necesarias cuando se retira el CD
// Por ejemplo, terminar la ejecución de la aplicación
// ...
// Retornar FALSE para detener la recepción de notificaciones
return FALSE;
}
}
}
// Retornar TRUE para continuar recibiendo notificaciones
return TRUE;
}
// Función para registrar la notificación de cambio de hardware
void RegisterHardwareChangeNotification()
{
DEV_BROADCAST_DEVICEINTERFACE broadcastInterface;
ZeroMemory(&broadcastInterface, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
broadcastInterface.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;
HDEVNOTIFY hDevNotify = RegisterDeviceNotification(
AfxGetMainWnd()->GetSafeHwnd(),
&broadcastInterface,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if (hDevNotify == NULL)
{
// Error al registrar la notificación
}
else
{
// Crear un objeto de espera para recibir las notificaciones
HANDLE hWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// Configurar el objeto de espera para recibir notificaciones de cambio de hardware
HANDLE hWaitHandleArray[1] = { hWaitEvent };
RegisterWaitForSingleObject(
&hWaitEvent,
hWaitEvent,
HardwareChangeCallback,
NULL,
INFINITE,
WT_EXECUTEDEFAULT
);
}
}