int main()
{
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.lpszClassName = TEXT("usbMsg");
wc.lpfnWndProc = WndProc;
RegisterClass(&wc);
HWND h = CreateWindow(TEXT("usbMsg"), TEXT(""), 0, 0, 0, 0, 0,
0, 0, GetModuleHandle(0), 0);
MSG msg;
while (true)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
WatchDirectory((LPTSTR)g_fileName);
}
}
}
//下面是回調函數監聽U盤狀態
LRESULT CALLBACK WndProc(HWND h, UINT msg, WPARAM wp, LPARAM lp)
{
if (msg == WM_DEVICECHANGE)
{
if ((DWORD)wp == DBT_DEVICEARRIVAL)
{
DEV_BROADCAST_VOLUME* p = (DEV_BROADCAST_VOLUME*)lp;
if (p->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
int l = (int)(log(double(p->dbcv_unitmask)) / log(double(2)));
char panfu = 'A' + l;
printf("%c come--\n", 'A' + l);
g_hasIn = true;
g_fileName[0] = panfu;
g_fileName[1] = ':';
g_fileName[2] = '\\';
g_fileName[3] = '\\';
g_fileName[4] = '\0';
}
}
else if ((DWORD)wp == DBT_DEVICEREMOVECOMPLETE)
{
DEV_BROADCAST_VOLUME* p = (DEV_BROADCAST_VOLUME*)lp;
if (p->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
int l = (int)(log(double(p->dbcv_unitmask)) / log(double(2)));
printf("%c out--\n", 'A' + l);
g_hasIn = false;
}
}
return TRUE;
}
else return DefWindowProc(h, msg, wp, lp);
}
//監聽u盤文件的變化,主要包括文件和目錄的增刪改
void WatchDirectory(LPTSTR lpDir)
{
static DWORD dwWaitStatus;
static HANDLE dwChangeHandles[2];
static TCHAR lpDrive[4];//存儲磁盤符
static TCHAR lpFile[_MAX_FNAME];//用於存儲文件名
static TCHAR lpExt[_MAX_EXT];//用於存儲對應文件的後綴
static TCHAR lpDir2[_MAX_DIR];
static bool bFirst = true;
if (bFirst)
{
_tsplitpath_s(lpDir, lpDrive, 4, NULL, 0, lpFile, _MAX_FNAME, lpExt, _MAX_EXT);
lpDrive[2] = (TCHAR)'\\';
lpDrive[3] = (TCHAR)'\0';
dwChangeHandles[0] = FindFirstChangeNotificationA(
(LPCSTR)lpDir,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME); //文件名
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
return;
dwChangeHandles[1] = FindFirstChangeNotificationA(
(LPCSTR)lpDir,
TRUE,
FILE_NOTIFY_CHANGE_DIR_NAME); //路徑名
if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)
return;
bFirst = false;
}
{
dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, 100);
switch (dwWaitStatus)
{
case WAIT_OBJECT_0:
if (FindNextChangeNotification(dwChangeHandles[0]) == FALSE)
ExitProcess(GetLastError());
break;
case WAIT_OBJECT_0 + 1:
if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE)
ExitProcess(GetLastError());
break;
default:
break;
}
}
}