在VC中如何控制usb盘
在VC中如何控制usb盘,从程序中控制,如停止,弹出等等操作,现在主要是不知道如何停止,而U盘又不能直接弹出(非要先停止)
能告诉具体的方法或者相应的可用的API也可,谢谢!
问题点数:100、回复次数:10
Top
1 楼saliors(正在学习中)回复于 2005-08-17 08:33:22 得分 0 监测u盘插入,则根据WM_DEVICECHANGE消息。
LRESULT CTestUSBDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_DEVICECHANGE) //0x8000,0x8004
{
CString str;
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;
switch(wParam)
{
case DBT_CONFIGCHANGECANCELED:
TRACE("DBT_CONFIGCHANGECANCELED");
break;
case DBT_CONFIGCHANGED:
TRACE("DBT_CONFIGCHANGED");
break;
case DBT_DEVICEQUERYREMOVE:
TRACE("DBT_DEVICEQUERYREMOVE");
break;
case DBT_DEVICEQUERYREMOVEFAILED:
TRACE("DBT_DEVICEQUERYREMOVEFAILED");
break;
case DBT_DEVICEREMOVEPENDING:
TRACE("DBT_DEVICEREMOVEPENDING");
break;
case DBT_DEVICETYPESPECIFIC:
TRACE("DBT_DEVICETYPESPECIFIC");
break;
case DBT_QUERYCHANGECONFIG:
TRACE("DBT_QUERYCHANGECONFIG");
break;
case DBT_USERDEFINED:
TRACE("DBT_USERDEFINED");
break;
case DBT_DEVICEARRIVAL:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 插入", FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//AfxMessageBox(str);
}
else
{
char ch = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
str.Format("%c:\\",ch);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
else
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
//AfxMessageBox(str);
}
break;
default:
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
Top
2 楼saliors(正在学习中)回复于 2005-08-17 09:54:34 得分 100弹出U盘:
#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <devguid.h>
#define DWORD_PTR DWORD
#define ULONG_PTR DWORD
extern "C" {
#include "hidsdi.h"
}
// 需加入hid.lib
#include <setupapi.h>
// 需加入setupapi.lib
#include <regstr.h>
#include <winbase.h>
#include <cfgmgr32.h>
// 需要加入cfgmgr32.lib
#include <initguid.h>
//#include <usbiodef.h>
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,
0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE
int main(int argc, _TCHAR* argv[])
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
//--------------------------------------------------------------------------
// 获取设备信息
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// 查询信息失败
printf("ERROR - SetupDiGetClassDevs()");
return 1;
}
//--------------------------------------------------------------------------
// 枚举每个USB设备
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
LPTSTR buffer = NULL;
PVOID buffer2 = NULL;
DWORD buffersize = 0;
ULONG len;
CONFIGRET cr;
PNP_VETO_TYPE pnpvietotype;
CHAR vetoname[MAX_PATH];
ULONG ulStatus;
ULONG ulProblemNumber;
cr = CM_Get_DevNode_Status( &ulStatus,
&ulProblemNumber,
DeviceInfoData.DevInst,
0);
if ( CR_SUCCESS == cr )
{
printf("OK - CM_Get_DevNode_Status()[%d]\n", cr);
printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus);
printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber);
}
else
{
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr);
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError());
}
// DN_DISABLEABLE or DN_REMOVABLE
if ((DN_DISABLEABLE & ulStatus ) != 0 )
{
printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus);
}
else
{
continue;
}
if ((DN_REMOVABLE & ulStatus ) != 0 )
{
printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus);
}
else
{
continue;
}
len = MAX_PATH;
// pnpvietotype = PNP_VetoDevice;
cr = CM_Request_Device_Eject(
DeviceInfoData.DevInst,
&pnpvietotype,
vetoname,
len,
0
);
if ( CR_SUCCESS == cr ) {
printf("OK - CM_Request_Device_Eject()[%d]\n", cr);
} else {
printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr);
printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError());
}
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
Top
3 楼agchen81(吾将上下尔求索)回复于 2005-08-17 10:19:03 得分 0 强,当时我做这种功能时花了很多心血啊
Top
4 楼cangjing(方长)回复于 2005-08-17 10:30:47 得分 0 hidsdi.h
hid.lib
setupapi.h
setupapi.lib
......
等等到哪儿去找?
Top
5 楼masterz(www.fruitfruit.com)回复于 2005-08-17 12:05:08 得分 0 install microsoft platform sdk
www.microsoft.com/msdownload/platformsdk/sdkupdate/
Top
6 楼masterz(www.fruitfruit.com)回复于 2005-08-17 12:05:49 得分 0 you can also have a look at DeviceIoControl
Top
7 楼saliors(正在学习中)回复于 2005-08-17 13:40:32 得分 0 装WIN2000SDK
Top
8 楼DrSmart(斯玛特)回复于 2005-09-30 12:49:08 得分 0 这是硬件相关的在DDK中,sdk他有吗?
新问题出炉---如何解决USEkey插入时让程序即时运行楼主sunxutx(孤云挂月)2006-06-27 22:11:19 在 VC/MFC / 进程/线程/DLL 提问
一种类似于硬件狗似的key类产品
如何在它插入usb接口时候让系统运行我安装好的程序
或者程序已经运行,当key插入时通知已运行的程序
是否有一些系统参数能够利用
请各位前辈指点一二
最好能附上一些例子
谢谢 分不够可以再加
问题点数:100、回复次数:9
Top
1 楼goingup(向我开火!)回复于 2006-06-27 23:09:12 得分 0 USBKey吧?
不是很懂,帮你顶
Top
2 楼aa3000(杀手K)回复于 2006-06-27 23:14:24 得分 0 楼主说的KEY允许增加自己的程序进去吗?如果可以的话加一个自动运行,里面调用一个自己写的程序,这个程序怎么写就随便咯
Top
3 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 11:48:52 得分 50有个WM_DEVICECHANGE系统消息监视设备插入拔除
Top
4 楼sunxutx(孤云挂月)回复于 2006-06-28 14:05:14 得分 0 这个key里面只有64k,并且插入的时候,任何设备管理都看不到
与u盘不一样
所以挺郁闷的
Top
5 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 16:58:25 得分 0 插入的时候,任何设备管理都看不到
....................................
没装驱动?重起也看不到?
Top
6 楼sunxutx(孤云挂月)回复于 2006-06-28 19:30:00 得分 0 是这样的
是我没叙述清楚
插入usbkey后 在 设备管理器的通用串行总线控制器
中有显示
但是不知道该怎样编辑
自带的管理工具中他可以识别key插入和拔出
不知是怎么设计的
而并不像u盘中的数据在我的电脑中就能看到
Top
7 楼gohappy_1999(碧水蓝天)回复于 2006-06-28 20:36:04 得分 50那你可以另外写个程序,捕获WM—DEVICECHANGE消息,判断是不是你的USBKEY的插拔。
(这里可以参考一下:http://community.csdn.net/Expert/TopicView3.asp?id=4211978)
在你的这个程序中启动另一个程序既可。
Top
8 楼sunxutx(孤云挂月)回复于 2006-06-29 04:51:33 得分 0 郁闷 由于开发周期的原因 我是用vb写的代码
hook已经可以拦截到键盘却拦截不了系统消息。。。
更别提WM—DEVICECHANGE
没有 语法错误。。。
不晓得怎么弄了
Top
9 楼sunxutx(孤云挂月)回复于 2006-06-30 16:48:52 得分 0 拦截到了系统消息 呼~
谢谢大家热心帮忙
发分
Top