请各位大侠指教,在usb硬盘加载后,如何区分并判断系统中的usb硬盘和本地硬盘?

解决方案 »

  1.   

    GetDriveType("G:\");
    返回DRIVE_REMOVABLE表示G:盘是可移动磁盘
    如果你有软件驱A,B盘也会一样返回DRIVE_REMOVABLE
    一般来说可移动磁盘就是U盘!
      

  2.   

    你说的是U盘,我知道你这种方法是可以判断U盘的,但usb硬盘不是DRIVE_REMOVABLE的,你可以试试,但究竟如何判断移动硬盘和本地硬盘呢?请问各位大侠有没有什么高见?希望大侠指点
      

  3.   

    有办法的
    在u盘插入的时候,系统会将产生的盘符信息通过消息
    传递给向系统注册过响应该usb设备的窗体
      

  4.   


    我用活动硬盘进行测试,可以判断它的插入或者拔出。试一下吧!// CheckUsb.cpp : Defines the entry point for the application.
    //
    #include "stdafx.h"
    #include "Dbt.h"
    void DeviceChangeEventOpt(WPARAM wParam, LPARAM lParam)
    {
    switch(wParam)
    {
    case DBT_CONFIGCHANGECANCELED:
    MessageBox(NULL,"设备改变DBT_CONFIGCHANGECANCELED","提示",MB_OK);
    break;
    case DBT_CONFIGCHANGED:
    MessageBox(NULL,"设备改变DBT_CONFIGCHANGED","提示",MB_OK);
    break;
    case DBT_CUSTOMEVENT: 
    MessageBox(NULL,"设备改变DBT_CUSTOMEVENT","提示",MB_OK);
    break;
    case DBT_DEVICEARRIVAL: // A device has been inserted and is now available.  

    MessageBox(NULL,"设备改变DBT_DEVICEARRIVAL","提示",MB_OK);

    DEV_BROADCAST_HDR *stHDR;
    stHDR = (DEV_BROADCAST_HDR *)lParam; //判断设备类型
    switch(stHDR->dbch_devicetype)
    {
    case DBT_DEVTYP_DEVICEINTERFACE: 
    MessageBox(NULL,"设备类型 DBT_DEVTYP_DEVICEINTERFACE","提示",MB_OK);
    break;
    case DBT_DEVTYP_HANDLE: 
    MessageBox(NULL,"设备类型 DBT_DEVTYP_HANDLE","提示",MB_OK);
    break;
    case DBT_DEVTYP_OEM: 
    MessageBox(NULL,"设备类型 DBT_DEVTYP_OEM","提示",MB_OK);
    break;
    case DBT_DEVTYP_PORT:
    MessageBox(NULL,"设备类型 DBT_DEVTYP_PORT","提示",MB_OK);
    break;
    case DBT_DEVTYP_VOLUME:// Logical volume. This structure is a DEV_BROADCAST_VOLUME structure
    MessageBox(NULL,"设备类型 DBT_DEVTYP_VOLUME","提示",MB_OK);
    break;
    }
    //

    break;
    case DBT_DEVICEQUERYREMOVE: 
    MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVE","提示",MB_OK);
    break;
    case DBT_DEVICEQUERYREMOVEFAILED: 
    MessageBox(NULL,"设备改变DBT_DEVICEQUERYREMOVEFAILED","提示",MB_OK);
    break;
    case DBT_DEVICEREMOVECOMPLETE:// A device has been removed. 
    MessageBox(NULL,"设备改变DBT_DEVICEREMOVECOMPLETE","提示",MB_OK);
    break;
    case DBT_DEVICEREMOVEPENDING:// 
    MessageBox(NULL,"设备改变DBT_DEVICEREMOVEPENDING","提示",MB_OK);
    break;
    case DBT_DEVICETYPESPECIFIC:// 
    MessageBox(NULL,"设备改变DBT_DEVICETYPESPECIFIC","提示",MB_OK);
    break;
    case DBT_QUERYCHANGECONFIG:  
    MessageBox(NULL,"设备改变DBT_QUERYCHANGECONFIG","提示",MB_OK);
    break;
    case DBT_USERDEFINED ://
    MessageBox(NULL,"设备改变DBT_USERDEFINED","提示",MB_OK);
    break;

    }
    }HWND hwndMain;
    LRESULT CALLBACK WndProc(
     HWND hwnd,      // handle to window
     UINT uMsg,      // message identifier
     WPARAM wParam,  // first message parameter
     LPARAM lParam   // second message parameter
     )
    {

    switch(uMsg)
    {
    case WM_CREATE:
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    case WM_COMMAND:
    break;
    case WM_DEVICECHANGE:

    DeviceChangeEventOpt(wParam,lParam);


    break;
    }
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    // TODO: Place code here.

    WNDCLASSEX wclass;
    MSG msg;

    wclass.cbClsExtra = 0;
    wclass.cbSize = sizeof(WNDCLASSEX);
    wclass.cbWndExtra = 0;
    wclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wclass.hCursor = NULL;
    wclass.hIcon = NULL;
    wclass.hIconSm = NULL;
    wclass.hInstance = hInstance;
    wclass.lpfnWndProc =(WNDPROC)WndProc;
    wclass.lpszClassName = "CheckUSB";
    wclass.lpszMenuName = NULL;
    wclass.style = CS_DBLCLKS;



    if(!RegisterClassEx(&wclass))
    {
    MessageBox(NULL,"类创建失败","类创建失败",MB_OK);
    }
    hwndMain = CreateWindow("CheckUSB","检测USB设备",
    WS_OVERLAPPED | WS_SYSMENU  | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 320, 300,NULL, NULL, hInstance, NULL);
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg); //translate the message into its char equivelent
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }
      

  5.   

    对于u盘来说,它属于
    DBT_DEVTYP_VOLUME
    所以
    当它插入硬盘以后,它的盘符信息保存在以下结构中
    typedef struct _DEV_BROADCAST_VOLUME {
      DWORD dbcv_size; 
      DWORD dbcv_devicetype; 
      DWORD dbcv_reserved; 
      DWORD dbcv_unitmask; 
      WORD dbcv_flags; 
    } DEV_BROADCAST_VOLUME;dbcv_unitmask里就是它的盘符
    A logical unit mask identifying one or more logical units. Each bit in the mask corresponds to one logical drive. Bit 0 represents drive A, bit 1 represents drive B, and so on