Qualche mesetto fa mi sono chiesto se non ci fosse una maniera per lanciare automaticamente il mio MozUp quando inserivo il mio pendrive nel pc, un pò come succede quando inserisci un cd ed il sistema automaticamente legge il file autorun.inf e fa il suo mestiere… .

Logo usb

Naturalmente, anche se sul MozUp c’é un’opzione per generare il file autorun.ini,

l’autorun non funziona per questioni di sicurezza: il sistema si limita a prendere l’icona, ma non esegue nulla. Allora mi sono detto: vediamo cosa mi propongono le api di windows e se è semplice pensare ad un programmino che mi permetta di lanciare il MozUp all’inserimento della mia penna usb. In effetti il sistema notifica l’inserimento e la rimozione di una qualsiasi periferica “hotplug”, ad ogni finestra che abbia richiesto la notifica con la funzione RegisterDeviceNotification, con il messaggio WM_DEVICECHANGE. Nel caso dei pendrive usb la cosa è ancora più semplice, perchè non c’é bisogno di richiedere la notifica.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_PAINT:
			......
			break;
		case WM_DEVICECHANGE:
			return Main_OnDeviceChange(hWnd,wParam,lParam);
			break;
		default:
			....
	}
}

Questo messaggio è inviato in broadcast a tutte le finestre, e indica quando una periferica è stata inserita, rimossa, o in generale quando viene scatenato un evento attinente a queste azioni (es: quando la rimozione della periferica è fallita, …).

Per sapere esattamente quale di queste azioni è avvenuta ho scritto una semplice funzione:

LRESULT Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
	PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
	switch(wParam)
	{
		case DBT_DEVICEARRIVAL:
		{
			... //caso nel quale la periferica è stata inserita
			break;
		}
		case DBT_DEVICEREMOVECOMPLETE:
		{
			... //caso nel quale la periferica è stata inserita
			break;
		}
		default:
		{}
	}
}

Se sei interessato a questo post, potresti anche provare a leggere:

    No related posts