結局TypedEventHandlerのアダプタはやめて、DeviceWatcherクラスのアダプタとして、イベントをboost.signalに変換するようにしてみた。
namespace en = Windows::Devices::Enumeration;
namespace f = Windows::Foundation;
ref class DeviceWatcherAdapter
{
internal:
DeviceWatcherAdapter()
{
watcher_ = en::DeviceInformation::CreateWatcher();
watcher_->Added += ref new f::TypedEventHandler<en::DeviceWatcher^,en::DeviceInformation^>(this,&DeviceWatcherAdapter::Added);
watcher_->EnumerationCompleted += ref new f::TypedEventHandler<en::DeviceWatcher^ , Platform::Object^ >(this,&DeviceWatcherAdapter::EnumerationCompleted);
watcher_->Updated += ref new f::TypedEventHandler<en::DeviceWatcher^ , en::DeviceInformationUpdate^ >(this,&DeviceWatcherAdapter::Updated);
watcher_->Removed += ref new f::TypedEventHandler<en::DeviceWatcher^ , en::DeviceInformationUpdate^ >(this,&DeviceWatcherAdapter::Removed);
watcher_->Stopped += ref new f::TypedEventHandler<en::DeviceWatcher^ , Platform::Object^ >(this,&DeviceWatcherAdapter::Stopped);
}
boost::signals2::signal<void (en::DeviceWatcher^ sender
, en::DeviceInformation^ deviceInterface) >& added(){return added_;}
boost::signals2::signal<void (en::DeviceWatcher^ sender,
Platform::Object^ obj) > &enumration_completed(){return enumration_completed_;}
boost::signals2::signal<void (en::DeviceWatcher^ sender,
en::DeviceInformationUpdate^ deviceInfo) >& updated(){return updated_;}
boost::signals2::signal<void (en::DeviceWatcher^ sender,
en::DeviceInformationUpdate^ deviceInfo) >& removed() { return removed_;}
boost::signals2::signal<void (en::DeviceWatcher^ sender,
Platform::Object^ obj) >& stopped() {return stopped_;}
void start()
{
watcher_->Start();
}
void stop()
{
watcher_->Stop();
}
private:
void Added(en::DeviceWatcher^ sender, en::DeviceInformation^ deviceInterface)
{
if(!added_.empty()){
added_(sender,deviceInterface);
}
}
void EnumerationCompleted(en::DeviceWatcher^ sender, Platform::Object^ obj)
{
if(!enumration_completed_.empty()){
enumration_completed_(sender,obj);
}
}
void Updated(en::DeviceWatcher^ sender, en::DeviceInformationUpdate^ deviceInfo)
{
if(!updated_.empty()){
updated_(sender,deviceInfo);
}
}
void Removed(en::DeviceWatcher^ sender, en::DeviceInformationUpdate^ deviceInfo)
{
if(!removed_.empty()){
removed_(sender,deviceInfo);
}
}
void Stopped(en::DeviceWatcher^ sender, Platform::Object^ obj)
{
if(!stopped_.empty()){
stopped_(sender,obj);
}
}
en::DeviceWatcher^ watcher_;
boost::signals2::signal<void (en::DeviceWatcher^ sender
, en::DeviceInformation^ deviceInterface) > added_;
boost::signals2::signal<void (en::DeviceWatcher^ sender, Platform::Object^ obj) > enumration_completed_;
boost::signals2::signal<void (en::DeviceWatcher^ sender, en::DeviceInformationUpdate^ deviceInfo) > updated_;
boost::signals2::signal<void (en::DeviceWatcher^ sender, en::DeviceInformationUpdate^ deviceInfo) > removed_;
boost::signals2::signal<void (en::DeviceWatcher^ sender, Platform::Object^ obj) > stopped_;
};
DeviceWatcherはデバイスのつけはずしや更新を教えてくれる。これを使ってデバイスを管理するクラスの内容を更新するように書き換えていく。IMMDeviceとかでもできるんだけど、こちらのほうが簡単そうである。