大家好啊,向大家请教个问题,如何实现有移动硬盘插入就禁用?
(参照别人的一个自动拷贝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);
}
(参照别人的一个自动拷贝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);
}
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. 哪个对应移动硬盘啊?
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盘一般提示可移动盘;
移动硬盘一般都是两个盘,会提示新加卷,不知道什么意思