監聽windows消息獲取U盤狀態和u盤路徑 實。現U盤文件狀態監聽

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;
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章