Как указал Майк Петриченко, мне нужно было вызвать BluetoothSetServiceState () с правильным GUID службы (устройства громкой связи в моем случае), который я нашел здесь: https://docs.microsoft.com/en-us/windows/client-management/mdm/policy-csp-bluetooth
Полный код:
BOOL CALLBACK BTHeadsetAuthCallbackEx(__in_opt LPVOID /*pvParam*/, __in PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)
{
BLUETOOTH_AUTHENTICATE_RESPONSE resp;
resp.bthAddressRemote = pAuthCallbackParams->deviceInfo.Address;
resp.authMethod = pAuthCallbackParams->authenticationMethod;
resp.negativeResponse = FALSE;
resp.passkeyInfo.passkey = pAuthCallbackParams->Passkey;
DWORD ret = BluetoothSendAuthenticationResponseEx( NULL, &resp );
if( ret != ERROR_SUCCESS )
{
logError( "BluetoothSendAuthenticationResponseEx failed with %u", ret );
return FALSE;
}
return TRUE;
}
BLUETOOTH_DEVICE_INFO deviceInfo = { sizeof(BLUETOOTH_DEVICE_INFO) };
deviceInfo.Address.ullLong = device->getAddress();
HBLUETOOTH_AUTHENTICATION_REGISTRATION regHandle;
DWORD err = BluetoothRegisterForAuthenticationEx( &deviceInfo, ®Handle, (PFN_AUTHENTICATION_CALLBACK_EX)&BTHeadsetAuthCallbackEx, NULL );
if( err != ERROR_SUCCESS )
{
logError( "BluetoothRegisterForAuthenticationEx failed with %u", err );
return false;
}
err = BluetoothAuthenticateDevice( NULL, NULL, &deviceInfo, L"0000", 4 );
if( err != ERROR_SUCCESS )
{
BluetoothUnregisterAuthentication( regHandle );
logError( "BluetoothAuthenticateDevice failed with %u", err );
return false;
}
BluetoothUnregisterAuthentication( regHandle );
HANDLE btHeadset;
BLUETOOTH_FIND_RADIO_PARAMS rfind = { sizeof( rfind ) };
BluetoothFindFirstRadio( &rfind, &btHeadset );
GUID id = { 0x0000111e, 0x0000, 0x1000, { 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb} };
err = BluetoothSetServiceState( &btHeadset, &deviceInfo, &id, BLUETOOTH_SERVICE_ENABLE );
if( err != ERROR_SUCCESS )
{
logError( "BluetoothSetServiceState failed with %u", err );
}
logNorm( "BluetoothSetServiceState successfull" );
примечание: это не полная защита от дурака.Я использую первое найденное устройство с пустыми параметрами поиска.Некоторая очистка будет осуществляться там.