OnDeviceChange无法读取设备是接入还是拔掉-----RegisterDeviceNotification注册

OnDeviceChange无法读取设备是接入还是拔掉
平板以MTP方式接入xp电脑

RegisterDeviceNotification注册时DEV_BROADCAST_DEVICEINTERFACE::dbcc_classguid该输入什么

OnDeviceChange(UINT nEventType, DWORD dwData)
nEventType = 7 dwData = 0
获取不到设备信息


------解决方案--------------------
bool Cxxxx::UsbRegistNotify(void)
{
HDEVNOTIFY hDevNotify;
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for(int i=0; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++) 
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];//我们在此只注册HID USB设备消息
hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if( !hDevNotify ) 
{
AfxMessageBox(_T("Can't register device notification: "));
return false;
}
}
return true;
}

LRESULT CPedometer_ConsoleDlg::OnDeviceChange(WPARAM nEventType, LPARAM dwData)//设备状态改变时的处理函数
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)dwData;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;

int nLenDevId;
int idx;
CString szDevId;
CString szClass;
CString szLog;

CString id,id2,id3,id4;
CString Name;

if(!(DBT_DEVICEARRIVAL == nEventType 
------解决方案--------------------
 DBT_DEVICEREMOVECOMPLETE == nEventType))
return S_FALSE;

switch( pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
ASSERT(lstrlen(pDevInf->dbcc_name) > 4);
szDevId = pDevInf->dbcc_name+4;
idx = szDevId.ReverseFind(_T('#'));
ASSERT( -1 != idx );
szDevId.Left(idx);
szDevId.Replace(_T('#'), _T('\\'));
szDevId.MakeUpper();

idx = szDevId.Find(_T('\\'));
ASSERT(-1 != idx );
szClass = szDevId.Left(idx);
nLenDevId = szDevId.GetLength();

Name = pDevInf->dbcc_name;   
id.Format(_T("VID_%4.4X"), MY_VID);
id3.Format(_T("Vid_%4.4x"), MY_VID);
id2.Format(_T("PID_%4.4X"), MY_PID1);
id4.Format(_T("Pid_%4.4x"), MY_PID1);

if(((Name.Find(id3, 0) == -1)  && (Name.Find(id4, 0) == -1)) && ((Name.Find(id, 0) == -1)  && (Name.Find(id2, 0) == -1)))
break;

if (DBT_DEVICEARRIVAL == nEventType ) 
;插入
else 
;拔除设备
AddCom();
UpdateData(false);
((CButton*)GetDlgItem(IDC_BUTTON1))->SetWindowTextW(_T("Connect"));
break;

default:
break;
}
return TRUE;
}
------解决方案--------------------
DBT_DEVICEARRIVAL   A device has been inserted and is now available. 



DBT_DEVICEQUERYREMOVE   Permission to remove a device is requested. Any application can deny this request and cancel the removal.



DBT_DEVICEQUERYREMOVEFAILED   Request to remove a device has been canceled.



DBT_DEVICEREMOVEPENDING   Device is about to be removed. Cannot be denied.



DBT_DEVICEREMOVECOMPLETE   Device has been removed.



DBT_DEVICETYPESPECIFIC   Device-specific event.



DBT_CONFIGCHANGED   Current configuration has changed.



DBT_DEVNODES_CHANGED   Device node has changed.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: registerdevicenotification是一个注册设备通知的函数。它可以用来让设备在特定的事件发生时接收通知,比如收到新消息、网络连接状态变化等。这个函数通常用于开发移动应用程序,以便及时地向用户提供相关信息。 ### 回答2: registerdevicenotification是一个WindowsAPI功能,用于将消息机制中的通知过程与Windows设备管理器中的设备事件相关联。这个API使程序能够接收设备事件通知,如设备插入、设备移动或设备删除事件。无论是本地设备还是网络设备,都可以被通知。 在应用程序中使用registerdevicenotification时,首先要定义一个DEV_BROADCAST_DEVICEINTERFACE结构体,该结构体描述了所希望接收通知的设备类。然后调用RegisterDeviceNotification函数,该函数将注册通知机制和设备事件相关联。 当设备事件发生时,Windows将发出通知消息。通过在应用程序中使用处理程序,可以完成与事件相关联的任何活动。在处理程序中,开发人员可以获取事件代码,还可以获取发送通知消息的设备相关的信息,如设备类型、设备名称、端口等。 registerdevicenotification可以对开发人员十分有用。如果一个程序依赖于外接设备或其他硬件资源,registerdevicenotification可以确保程序对设备事件保持跟踪,并且在需要时能够动态地重新配置程序。 总之,registerdevicenotification是一个十分实用的Windows API功能,它可以帮助开发人员更好地利用系统资源,确保程序能够正常工作。 ### 回答3: registerdevicenotification是一个在iOS开发中使用的函数,它是用于获取设备通知的方法。在iOS系统中,当收到新的消息、推送、短信或者电话等通知信息时,应用程序需要通过registerdevicenotification注册通知,并在用户允许后上报通知,以便及时地提醒用户。 在使用registerdevicenotification函数之前,我们需要在Xcode工程设置中添加以下代码: import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { //注册APNS通知 registerForRemoteNotification() return true } func registerForRemoteNotification() { UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in if error == nil { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } } } //接收Device Token func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("Device Token: \(tokenString)") } //接收来自APNS服务器的通知 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) { print("userInfo: \(userInfo)") } //接收失败通知 func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { print("Failed to register: \(error)") } } 以上代码片段即为一个典型的registerdevicenotification的使用范例,当用户在应用的第一次启动时,会自动调用registerForRemoteNotification函数,弹出授权提示框,请求用户允许通知权限,并在用户允许后向APNS服务器申请注册。当服务器返回注册Device Token后,会触发系统回调函数didRegisterForRemoteNotificationsWithDeviceToken,应用程序可以在这个函数中获取到Device Token用于向后台推送消息。 总的来说,registerdevicenotification是iOS开发中十分重要的一个函数,它是应用程序获取用户通知权限以及注册通知的关键步骤。使用registerdevicenotification可以实现应用程序在后台推送消息、提醒用户时效果更加实时和流畅,更加符合用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值