| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2997 人关注过本帖
标题:[求助]如何 监听 WINDOWS 事件
只看楼主 加入收藏
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
收藏
 问题点数:0 回复次数:3 
[求助]如何 监听 WINDOWS 事件

我想监听一个USB设备的情况
一旦这个设备被拔除让我能知道
以停止某些人的权限
接着再改变程序方向

搜索更多相关主题的帖子: WINDOWS 监听 
2006-07-06 14:57
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
收藏
得分:0 
我在CSDN上看到相关资料 转到此
请高手帮我分析一下
我看不懂
我只想实现其中的一部分
首先要实现的是
对拔除事件的监听

此号自封于2006年11月30日
2006-07-06 15:08
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
收藏
得分:0 

[CODE]监测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);
}[/CODE]


此号自封于2006年11月30日
2006-07-06 15:09
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
收藏
得分:0 

[CODE]弹出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;
}[/CODE]


此号自封于2006年11月30日
2006-07-06 15:09
快速回复:[求助]如何 监听 WINDOWS 事件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030910 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved