我想做一个程序,可以检测到USB、1394设备的插入与拔出,并且对于USB设备需要判断类型,如键盘、鼠标等,特别是能够判断是不是USB存储设备,如U盘、移动硬盘等。然后根据访问权限来控制USB设备。
目前连第一步也没有解决,即对设备的检测问题,更别说访问控制了。
求大家帮帮忙啦。
凡提供重要信息者奖励1000分。
9 个解决方案
#1
不会,看看这两个FAQ
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=165464
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197153
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=165464
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197153
#2
楼上说的我知道,关键是怎样在第一时间可以知道USB设备的接入与拔出,通过setupapi来得到太迟了。还有其他的办法吗?
#3
我记得有两个windows消息。一个是设备被弹出,一个是真正被用户从计算机上拔下来。
用spy++试试,我记得上次是通过它知道的,好用。
用spy++试试,我记得上次是通过它知道的,好用。
#4
用一个线程,死循环,来监控
FindWindow(NULL, _T("安全删除硬件"));
FindWindow(NULL, _T("拔出或弹出硬件"));
如果这些出来了。但用户又取消了,呵呵
就不知道该怎么处理了
但上面最起码知道用户想要拔出USB
FindWindow(NULL, _T("安全删除硬件"));
FindWindow(NULL, _T("拔出或弹出硬件"));
如果这些出来了。但用户又取消了,呵呵
就不知道该怎么处理了
但上面最起码知道用户想要拔出USB
#5
我测试过,插入肯定是有一个WM_DEVICECHAGE,然后可以根据消息的lparam来分析是哪一种动作,如DBT_DEVICEARRIVAL或DBT_DEVICEREMOVECOMPLETE,并且可以得到设备的类型是DBT_DEVTYP_VOLUME,但是我现在不知道是不是所有的设备都是这样的?此外我还想进一步知道插入的设备的信息,如盘符、大小等。
不知哪位大侠可以指教?
不知哪位大侠可以指教?
#6
获取系统的所有接口放入MIB_IFTABLE结构中,
基中MIB_IFTABLE中的table为所有接口表,如果接口
USB、1394设备的插入与拔出,对应table[i]的dwOperStatus会变化,详看MSDN
MIB_IFTABLE *pIfTable = NULL;
ULONG dwSize = 0;
DWORD dwRet;
//获取整个接口表大小
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != ERROR_INSUFFICIENT_BUFFER )
throw CYException("1 get local interface table error!");
//分配接口表存放位置
pIfTable = ( MIB_IFTABLE * ) new char[dwSize];
if ( pIfTable == NULL )
throw CYException("2 owing to alloc memory error,get local interface failed");
//获取接口表
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != NO_ERROR )
throw CYException("3 some erro occur!");
iftable.pTable=pIfTable;
基中MIB_IFTABLE中的table为所有接口表,如果接口
USB、1394设备的插入与拔出,对应table[i]的dwOperStatus会变化,详看MSDN
MIB_IFTABLE *pIfTable = NULL;
ULONG dwSize = 0;
DWORD dwRet;
//获取整个接口表大小
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != ERROR_INSUFFICIENT_BUFFER )
throw CYException("1 get local interface table error!");
//分配接口表存放位置
pIfTable = ( MIB_IFTABLE * ) new char[dwSize];
if ( pIfTable == NULL )
throw CYException("2 owing to alloc memory error,get local interface failed");
//获取接口表
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != NO_ERROR )
throw CYException("3 some erro occur!");
iftable.pTable=pIfTable;
#7
楼上还有再详细一些吗?
首先我前面的处理是否正确?
你的意思是等检测到消息之后再通过查看接口表来得到详细信息是吗?
首先我前面的处理是否正确?
你的意思是等检测到消息之后再通过查看接口表来得到详细信息是吗?
#8
对不起,我看错了,
#9
没关系,谢谢你的回复,说不定以后可以用呀!:)
#1
不会,看看这两个FAQ
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=165464
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197153
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=165464
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197153
#2
楼上说的我知道,关键是怎样在第一时间可以知道USB设备的接入与拔出,通过setupapi来得到太迟了。还有其他的办法吗?
#3
我记得有两个windows消息。一个是设备被弹出,一个是真正被用户从计算机上拔下来。
用spy++试试,我记得上次是通过它知道的,好用。
用spy++试试,我记得上次是通过它知道的,好用。
#4
用一个线程,死循环,来监控
FindWindow(NULL, _T("安全删除硬件"));
FindWindow(NULL, _T("拔出或弹出硬件"));
如果这些出来了。但用户又取消了,呵呵
就不知道该怎么处理了
但上面最起码知道用户想要拔出USB
FindWindow(NULL, _T("安全删除硬件"));
FindWindow(NULL, _T("拔出或弹出硬件"));
如果这些出来了。但用户又取消了,呵呵
就不知道该怎么处理了
但上面最起码知道用户想要拔出USB
#5
我测试过,插入肯定是有一个WM_DEVICECHAGE,然后可以根据消息的lparam来分析是哪一种动作,如DBT_DEVICEARRIVAL或DBT_DEVICEREMOVECOMPLETE,并且可以得到设备的类型是DBT_DEVTYP_VOLUME,但是我现在不知道是不是所有的设备都是这样的?此外我还想进一步知道插入的设备的信息,如盘符、大小等。
不知哪位大侠可以指教?
不知哪位大侠可以指教?
#6
获取系统的所有接口放入MIB_IFTABLE结构中,
基中MIB_IFTABLE中的table为所有接口表,如果接口
USB、1394设备的插入与拔出,对应table[i]的dwOperStatus会变化,详看MSDN
MIB_IFTABLE *pIfTable = NULL;
ULONG dwSize = 0;
DWORD dwRet;
//获取整个接口表大小
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != ERROR_INSUFFICIENT_BUFFER )
throw CYException("1 get local interface table error!");
//分配接口表存放位置
pIfTable = ( MIB_IFTABLE * ) new char[dwSize];
if ( pIfTable == NULL )
throw CYException("2 owing to alloc memory error,get local interface failed");
//获取接口表
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != NO_ERROR )
throw CYException("3 some erro occur!");
iftable.pTable=pIfTable;
基中MIB_IFTABLE中的table为所有接口表,如果接口
USB、1394设备的插入与拔出,对应table[i]的dwOperStatus会变化,详看MSDN
MIB_IFTABLE *pIfTable = NULL;
ULONG dwSize = 0;
DWORD dwRet;
//获取整个接口表大小
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != ERROR_INSUFFICIENT_BUFFER )
throw CYException("1 get local interface table error!");
//分配接口表存放位置
pIfTable = ( MIB_IFTABLE * ) new char[dwSize];
if ( pIfTable == NULL )
throw CYException("2 owing to alloc memory error,get local interface failed");
//获取接口表
dwRet = GetIfTable( pIfTable, &dwSize, TRUE );
if ( dwRet != NO_ERROR )
throw CYException("3 some erro occur!");
iftable.pTable=pIfTable;
#7
楼上还有再详细一些吗?
首先我前面的处理是否正确?
你的意思是等检测到消息之后再通过查看接口表来得到详细信息是吗?
首先我前面的处理是否正确?
你的意思是等检测到消息之后再通过查看接口表来得到详细信息是吗?
#8
对不起,我看错了,
#9
没关系,谢谢你的回复,说不定以后可以用呀!:)