gpt4 book ai didi

c# - 是否有 Windows 事件来查明蓝牙设备是否正在配对

转载 作者:行者123 更新时间:2023-11-30 17:28:23 32 4
gpt4 key购买 nike

我正在构建一个允许我与蓝牙设备配对的应用程序。现在我正试图在 C# 中找到一个事件,它允许我检测何时添加或准备添加设备(请参阅 img:Windows 10 弹出窗口)

enter image description here

有人知道我要找哪个吗?

最佳答案

我有点晚了,但这里有一些关于我在普通 Raw API(C++ 中)中使用 WM_DEVICECHANGE 消息所做的事情的片段。

  • 您需要拦截 WM_DEVICECHANGE 消息(显然)
  • 您首先需要“注册”正确的 GUID:
  • GUID_BTHPORT_DEVICE_INTERFACE {0850302A-B344-4fda-9BE9-90576B8D46F0} 拦截有关 radio 本身的事件
  • GUID_BTH_DEVICE_INTERFACE {00F40965-E89D-4487-9890-87C3ABB211F4} 拦截有关任何蓝牙设备的事件和/或
  • GUID_BLUETOOTHLE_DEVICE_INTERFACE{781aee18-7733-4ce4-add0-91f41c67b592} 拦截关于 BLE 的事件设备。

(这些是“界面 GUID”,以防您在 SetupAPIxx/CM_xx 例程中需要它们)

我正在使用以下代码来“注册”它们:

HDEVNOTIFY UDeviceInfoHandler::RegisterDeviceNotification(  HWND    hwnd,
GUID InterfaceClassGuid,
DWORD flags)
{
DEV_BROADCAST_DEVICEINTERFACE DevFilter;
::ZeroMemory(&DevFilter, sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
DevFilter.dbcc_size = sizeof( DEV_BROADCAST_DEVICEINTERFACE );
DevFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevFilter.dbcc_classguid = InterfaceClassGuid;
return ::RegisterDeviceNotification(hwnd, //events recipient
&DevFilter, //type of device
flags); //type of recipient handle
}

bool UDeviceInfoHandler::UnregisterDeviceNotification(HDEVNOTIFY hdevnotify)
{
return TRUE==::UnregisterDeviceNotification(hdevnotify);
}

此时,您将能够

  • 查看“ radio ”出现/消失(即通过在“设置”中选择“激活蓝牙”复选框)
  • 查看 BT2.x 虚拟 COM 端口出现/消失
  • 要查看 BLE 设备出现/消失,前提是它们已经“配对”(简而言之,已添加到注册表中)

通过处理

  • DBT_DEVICEARRIVAL|DBT_DEVTYP_DEVICEINTERFACE 和
  • DBT_DEVICEREMOVECOMPLETE|DBT_DEVTYP_DEVICEINTERFACE

WM_DEVICECHANGE 处理程序中的消息。

如果您需要访问与 radio /设备相关的 DBT_CUSTOMEVENT 消息,您首先需要为 WM_DEVICECHANGE 也“注册”一些“事件”,但要为 radio 的“HANDLE”注册。您可以注册以下事件的GUID

  • GUID_BLUETOOTH_RADIO_IN_RANGE
  • GUID_BLUETOOTH_RADIO_OUT_OF_RANGE
  • GUID_BLUETOOTH_L2CAP_EVENT
  • GUID_BLUETOOTH_HCI_EVENT
  • GUID_BLUETOOTH_HCI_VENDOR_EVENT

使用类似的东西

void UBthDeviceInfoHandler::RegisterBthNotifications(HWND hwnd,const UGuidItems& guids)
{
BLUETOOTH_FIND_RADIO_PARAMS radio_params;
radio_params.dwSize = sizeof(BLUETOOTH_FIND_RADIO_PARAMS);

HANDLE hRadio;
HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio(&radio_params, &hRadio);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
//for every events Guid you need
HDEVNOTIFY hdevnotify=
RegisterHandleNotification( hwnd,
hRadio,
Guid,
DEVICE_NOTIFY_WINDOW_HANDLE);
if (hdevnotify!=NULL){
//insert code here
}
else{
//error handling
}
//end for
} while (BluetoothFindNextRadio(hFind, &hRadio));

BluetoothFindRadioClose(hFind);
}
}

此时,您将能够通过处理 WM_DEVICECHANGE 处理程序的 DBT_CUSTOMEVENT|DBT_DEVTYP_HANDLE 移植来接收这些事件,例如

    [...]
#if (WINVER >= 0x040A)
case DBT_CUSTOMEVENT:
//@see https://msdn.microsoft.com/en-us/library/aa363217(v=vs.85).aspx
if (lParam!=0){
PDEV_BROADCAST_HDR phdr = reinterpret_cast<PDEV_BROADCAST_HDR> (lParam);
switch (phdr->dbch_devicetype){
case DBT_DEVTYP_HANDLE:
{
//@see https://learn.microsoft.com/en-us/windows/desktop/bluetooth/bluetooth-and-wm-devicechange-messages

//typedef struct _DEV_BROADCAST_HANDLE {
// DWORD dbch_size;
// DWORD dbch_devicetype;
// DWORD dbch_reserved;
// HANDLE dbch_handle; // file handle used in call to RegisterDeviceNotification
// HDEVNOTIFY dbch_hdevnotify; // returned from RegisterDeviceNotification
// //
// // The following 3 fields are only valid if wParam is DBT_CUSTOMEVENT.
// //
// GUID dbch_eventguid;
// LONG dbch_nameoffset; // offset (bytes) of variable-length string buffer (-1 if none)
// BYTE dbch_data[1]; // variable-sized buffer, potentially containing binary and/or text data
//} DEV_BROADCAST_HANDLE, *PDEV_BROADCAST_HANDLE;

PDEV_BROADCAST_HANDLE phndl=reinterpret_cast<PDEV_BROADCAST_HANDLE>(phdr);
CustomHandleEvent(*phndl);

}
break;


default:
break;
}
}//endif lParam!=0
break;
#endif // WINVER >= 0x040A

|dbch_eventguid|字段是 GUID_BLUETOOTH_RADIO_IN_RANGE 等事件之一。

好吧,这只是我迄今为止发现的内容的概述。不过,我们非常欢迎任何改进/建议/补充。我目前正在努力处理一些未记录的 CUSTOM_EVENTS,其 GUID 是

//When the Bluetooth radio handle is opened, call the RegisterDeviceNotification function and
//register for notifications on the handle using DBT_DEVTYP_HANDLE as the devicetype.
//When registered, the following GUIDs are sent,
//and the DEV_BROADCAST_HANDLE::dbch_data member is the associated buffer.

//this unknow event happens while looking for nearby devices in Settings.
DEFINE_GUID(GUID_UNKNOWN_EVENT_GUID1,0x1BBD4010, 0x498C, 0x4E85, 0x85, 0x1B, 0xEA, 0xA0, 0x57, 0x15, 0xC3, 0x7A);

//
DEFINE_GUID(GUID_UNKNOWN_EVENT_GUID2,0xD4EB6503, 0xC001, 0x441A, 0xAE, 0x42, 0xEE, 0x0D, 0xC9, 0x6C, 0x18, 0x85);

//happening when opening Settings|Bluetooth panel
DEFINE_GUID(GUID_UNKNOWN_EVENT_GUID3,0x7A7637FF, 0x531C, 0x4205, 0x97, 0x80, 0x3F, 0x33, 0x5F, 0x65, 0xAD, 0xDD);
//nameoffset=-1 datalen=8

//Settings|Devices -> Bluetooth activation/deactivation
DEFINE_GUID(GUID_UNKNOWN_EVENT_GUID4,0xB74983CD, 0xC2D9, 0x4E38, 0xB8, 0x0E, 0x54, 0x72, 0xFC, 0x10, 0x8B, 0x4B);
//nameoffset=-1 datalen=8

希望这对您有所帮助!

关于c# - 是否有 Windows 事件来查明蓝牙设备是否正在配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52968462/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com