大家好啊,向大家请教个问题,如何实现有移动硬盘插入就禁用?
(参照别人的一个自动拷贝U盘资料的程序,U盘部分已实现)
请熟悉这块的朋友提下建议,谢谢
(问题搞定加到100分再接帖)// stdafx.h : 标准系统包含文件的包含文件, 
// 或是经常使用但不常更改的 

#include <afxdisp.h>        // MFC 自动化类 
#include <Windows.h> 
#include <Winbase.h> 
#include <Winuser.h> 
#include <Dbt.h> 
#include <Winioctl.h> // LockUSBDlg.h : 头文件 
// 

// 构造 
public: 
BOOL IsRun; 
CString FindFdisk(); 
CString m_NewFdisk; 
CString m_OldFdisk; // 对话框数据 
  public: 
virtual BOOL DestroyWindow(); 
// 生成的消息映射函数 
virtual BOOL OnInitDialog(); 
afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 
afx_msg void OnPaint(); 
afx_msg HCURSOR OnQueryDragIcon(); 
afx_msg void OnHotKey(WPARAM wp,LPARAM lp); 
afx_msg void OnTimer(UINT nIDEvent); 

// LockUSBDlg.cpp : 实现文件 
// 

BEGIN_MESSAGE_MAP(CLockUSBDlg, CDialog) 
//ON_MESSAGE(WM_HOTKEY,OnHotKey) 
ON_WM_TIMER() 
END_MESSAGE_MAP() BOOL CLockUSBDlg::OnInitDialog() 

SetIcon(m_hIcon, TRUE); // 设置大图标 
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 
::RegisterHotKey(m_hWnd,199,MOD_ALT,'X'); 
    //------------------------------------- 
    SetTimer(0,80,NULL); 
    return TRUE; 
} void CLockUSBDlg::OnSysCommand(UINT nID, LPARAM lParam) 

/*if ((nID & 0xFFF0) == IDM_ABOUTBOX) 

CAboutDlg dlgAbout; 
dlgAbout.DoModal(); 
}*/ if(nID == SC_MINIMIZE)//如果最小化 
        ShowWindow(SW_HIDE);    //隐藏窗口 
else 

CDialog::OnSysCommand(nID, lParam); 


void CLockUSBDlg::OnHotKey(WPARAM wp, LPARAM lp) 

if(wp==199) 

if(IsWindowVisible()) 
ShowWindow(SW_HIDE); 
else 
// ShowWindow(SW_SHOWNORMAL); 
    ShowWindow(SW_SHOW); 

  // return CLockUSBDlg::OnHotKey( wp, lp); 
} BOOL CLockUSBDlg::DestroyWindow() 

::UnregisterHotKey(m_hWnd,199);//释放注册的热键 
return CDialog::DestroyWindow(); 
} //-------查找U盘------------------------------- 
CString CLockUSBDlg::FindFdisk() 

CString strdir; 
for(char cc='A';cc <='Z';cc++) 

strdir.Format(L"%c:",cc); 
if(GetDriveType((LPCTSTR)strdir)==DRIVE_REMOVABLE) //移动U盘(硬盘返回???)     
 return strdir; 
    } 
    return strdir=""; 
} void CLockUSBDlg::OnTimer(UINT nIDEvent) 

    HANDLE hDevice; 
DWORD dwOutBytes; 
bool bResult; 
CString logicalDisk; if(IsRun) 

m_NewFdisk=FindFdisk(); if(m_NewFdisk!=m_OldFdisk&&m_NewFdisk!="") 
{  logicalDisk = L"\\\\.\\" + m_NewFdisk; 
hDevice = CreateFile( 
logicalDisk,                        //要打开的驱动名称 
GENERIC_READ|GENERIC_WRITE,                  //访问方式 
FILE_SHARE_READ|FILE_SHARE_WRITE,            //共享方式 
NULL,                                        //安全描述符指针 
OPEN_EXISTING,                              //创建方式 
0,                                          //文件属性及标志 
NULL                                        //模板文件的句柄 
); //bResult = DeviceIoControl(hDevice,IOCTL_STORAGE_EJECT_MEDIA,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL);  
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL); } 
        if(m_NewFdisk!="") 
            m_OldFdisk=m_NewFdisk; 
else 
            m_OldFdisk="NULL"; 
} CDialog::OnTimer(nIDEvent); 
} //退出应用程序 
void CLockUSBDlg::OnBnClickedButtonCancel() 

CDialog::OnCancel(); 
} //隐藏应用程序图标 
void CLockUSBDlg::OnBnClickedButtonHide() 

ShowWindow(SW_HIDE); 
} //开始运行程序 void CLockUSBDlg::OnBnClickedButtonStart() 

    IsRun=TRUE; 
GetDlgItem(IDC_BUTTON_START)->EnableWindow(false); 
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(true); 
} //停止运行程序 
void CLockUSBDlg::OnBnClickedButtonStop() 

IsRun=FALSE; 
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); 
GetDlgItem(IDC_BUTTON_START)->EnableWindow(true); 

解决方案 »

  1.   

    Return Values
    The return value specifies the type of drive. It can be one of the following values.Value Meaning 
    DRIVE_UNKNOWN The drive type cannot be determined. 
    DRIVE_NO_ROOT_DIR The root path is invalid, for example, no volume is mounted at the path. 
    DRIVE_REMOVABLE The drive is a type that has removable media, for example, a floppy drive or removable hard disk. 
    DRIVE_FIXED The drive is a type that cannot be removed, for example, a fixed hard drive. 
    DRIVE_REMOTE The drive is a remote (network) drive. 
    DRIVE_CDROM The drive is a CD-ROM drive. 
    DRIVE_RAMDISK The drive is a RAM disk. 哪个对应移动硬盘啊?
      

  2.   

    Return Values
    The return value specifies the type of drive. It can be one of the following values.Value Meaning 
    DRIVE_UNKNOWN The drive type cannot be determined. 
    DRIVE_NO_ROOT_DIR The root path is invalid, for example, no volume is mounted at the path. 
    DRIVE_REMOVABLE The drive is a type that has removable media, for example, a floppy drive or removable hard disk. 
    DRIVE_FIXED The drive is a type that cannot be removed, for example, a fixed hard drive. 
    DRIVE_REMOTE The drive is a remote (network) drive. 
    DRIVE_CDROM The drive is a CD-ROM drive. 
    DRIVE_RAMDISK The drive is a RAM disk. 哪个对应移动硬盘啊?
    插入U盘一般提示可移动盘;
    移动硬盘一般都是两个盘,会提示新加卷,不知道什么意思
      

  3.   

    肯定是写USB设备的过滤驱动最为彻底!
      

  4.   

    调用系统的API不可以实现么?