2016-10-26 5 views
0

Я пишу одно приложение UWP, где мне нужно прослушивать события подключения наушников, когда наушники подключаются/подключаются через устройство (ПК или мобильный UWP).Как получить событие подключения наушников в UWP

Я пытался обработать MediaDevice::DefaultAudioRenderDeviceChanged и Windows::Devices::Enumeration::DeviceWatcher. Но ни один из них не мог работать так, как ожидалось.

Я могу обработать событие изменения устройства по умолчанию с помощью MediaDevice::DefaultAudioRenderDeviceChanged. Но для футляра для наушников устройство по умолчанию не изменяется. Таким образом, событие изменения устройства рендеринга не запускается.

Windows::Devices::Enumeration::DeviceWatcher также не может поймать это событие.

Итак, пожалуйста, помогите поделиться, как я могу получить событие подключения наушников в UWP? Большое спасибо.

ответ

0

Я попытался обработать MediaDevice :: DefaultAudioRenderDeviceChanged и Windows :: Devices :: Enumeration :: DeviceWatcher. Но ни один из них не мог работать так, как ожидалось.

Вы можете использовать DeviceWatcher обрабатывать DeviceWatcher.Added или DeviceWatcher.Removed события.

MainPage.xaml.cpp:

using namespace Windows::Devices::Enumeration; 
using namespace Windows::UI::Core; 

MainPage::MainPage() 
{ 
    InitializeComponent(); 
} 

void DeviceWatcherCppSample::MainPage::btnClick_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    watcher=DeviceInformation::CreateWatcher(DeviceClass::AudioRender); 
    handlerAddedToken=watcher->Added += ref new  Windows::Foundation::TypedEventHandler<DeviceWatcher ^, DeviceInformation ^>(this, &DeviceWatcherCppSample::MainPage::OnAdded); 

    handlerRemovedToken= watcher->Removed += ref new Windows::Foundation::TypedEventHandler<DeviceWatcher ^, DeviceInformationUpdate ^>(this, &DeviceWatcherCppSample::MainPage::OnRemoved); 
    handlerUpdatedToken= watcher->Updated += ref new Windows::Foundation::TypedEventHandler<Windows::Devices::Enumeration::DeviceWatcher ^, Windows::Devices::Enumeration::DeviceInformationUpdate ^>(this, &DeviceWatcherCppSample::MainPage::OnUpdated); 
    watcher->Start(); 
} 


void DeviceWatcherCppSample::MainPage::OnAdded(DeviceWatcher ^sender, DeviceInformation ^args) 
{ 
    this->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this, args]() 
    { 
     tbResult->Text = args->Name +"is Added"; 
    })); 
} 


void DeviceWatcherCppSample::MainPage::OnRemoved(DeviceWatcher ^sender, DeviceInformationUpdate ^args) 
{ 
    this->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this, args]() 
    { 
     tbResult->Text = args->Id + "is Removed"; 
    })); 
} 


void DeviceWatcherCppSample::MainPage::OnUpdated(Windows::Devices::Enumeration::DeviceWatcher ^sender, Windows::Devices::Enumeration::DeviceInformationUpdate ^args) 
{ 
    this->Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this, args]() 
    { 
     tbResult->Text = args->Id + "is Updated"; 
    })); 

} 

MainPage.xaml:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel VerticalAlignment="Center"> 
     <Button Name="btnClick" Click="btnClick_Click">Click Me to Watch</Button> 
     <TextBlock Name="tbResult"></TextBlock> 
    </StackPanel> 
</Grid> 

А вот полный демо: DeviceWatcherSample. Также вы можете обратиться к сценарию 2 из Official Sample.

+0

Большое спасибо Элвису. Он работает на мобильном телефоне! Но он все еще не работает на ПК, так как Speaker и Headphone используют одно и то же устройство под названием «Динамики/Наушники». – Lucky

+0

Наушники USB могут быть обнаружены правильно. Наушники с не-USB не могут. Их можно обнаружить только через «DeviceClass :: All», и только событие подключаемого модуля запускает событие обновления, что не является правильным решением для вашего требования. Итак, насколько я знаю, нет четкого способа сделать это на удалении. –