IImmersiveMonitorNotificationService
Immersive Shellにおいてディスプレイ(画面、モニター)変更を検出するために、その通知を受け取るインスタンスを登録・解除するためのインターフェイスです。
確認済み OS
Windows 8.1, Windows 10 (Build 10240, 10586)
構文
[C/C++]
// struct IImmersiveMonitorNotificationService : public IUnknown DECLARE_INTERFACE_IID_(IImmersiveMonitorNotificationService, IUnknown, "7C7A3E75-4362-4D12-860D-68EE72909F83") { /*** IUnknown methods ***/ STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObject) PURE; STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; /*** IImmersiveMonitorNotification methods ***/ STDMETHOD(Register)(THIS_ IImmersiveMonitorNotification*, ULONG*) PURE; STDMETHOD(Unregister)(THIS_ ULONG) PURE; };
※ すべてのメソッドの挙動は確認していません。
関連する型
インターフェイス
使用上の注意点
- IImmersiveMonitorNotificationService のインスタンスは通常エクスプローラープロセス上に存在するため、それ以外のプロセスから本インスタンスを利用するとRPC(Remote Procedure Call)経由での利用となります。IImmersiveMonitorNotificationService::Register で渡す IImmersiveMonitorNotification のインスタンスにもRPCが適用されてProxy/Stubのデータが作られるため、IImmersiveMonitorNotification を実装しているクラスがマーシャリングなどで特殊なことをしている場合は注意が必要です(特別なことをせずに普通にインプリメントしている場合は問題ありません)。
- IImmersiveMonitorNotificationService::Register の第2引数はDWORD値の戻り値となります。この値を IImmersiveMonitorNotificationService::Unregister に渡すことで登録したインスタンスを解除することができます。
- 上記と関連しますが、登録したインスタンスがエクスプローラーより先に終了する場合(アプリケーションが終了する場合など)は必ず Unregister を呼び出してください。
- 下記の「このインターフェイスの主な取得元」で紹介していますが、IImmersiveMonitorNotificationService を取得するためのサービスGUIDは IImmersiveMonitorNotificationService のIIDと異なります。
解説
Windows 8で導入された「Immersive Shell」において、IImmersiveMonitorNotificationService はディスプレイの追加やディスプレイ設定の変更(解像度や拡大率の変更など)が行われた際にその通知を受け取る目的で利用するインターフェイスの1つです。変更の通知を受け取るには、IImmersiveMonitorNotification の各メソッドを実装したクラスインスタンスを本インターフェイスのインスタンスに渡します。
このインターフェイスの主な取得元
「CLSID_ImmersiveShell」({C2F03A33-21F5-47FA-B4BB-156362A2F239}) のクラスインスタンスを CoCreateInstance で作成し、IServiceProvider::QueryService にてサービスIDに「5B8461BC-2B08-4F37-A627-7436D66D8134」を指定して取得します。
// ※ 定数名は仮のものです。 // {5B8461BC-2B08-4F37-A627-7436D66D8134} EXTERN_C const GUID SID_ImmersiveMonitorManagerNotificationService = { 0x5B8461BC, 0x2B08, 0x4F37, { 0xA6, 0x27, 0x74, 0x36, 0xD6, 0x6D, 0x81, 0x34 } }; HRESULT hr; IServiceProvider* pService; IImmersiveMonitorNotificationService* pNotificationService; // エクスプローラーが内部で登録するクラスのため // CLSCTX_LOCAL_SERVER を指定して取得する hr = CoCreateInstance(CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER, IID_IServiceProvider, reinterpret_cast<void**>(&pService)); if (SUCCEEDED(hr)) { hr = pService->QueryService(SID_ImmersiveMonitorManagerNotificationService, IID_IImmersiveMonitorNotificationService, reinterpret_cast<void**>(&pNotificationService)); if (SUCCEEDED(hr)) { // ここで IImmersiveMonitorNotificationService を利用して通知を登録 // 登録の解除を終えたら Release // (解除しない場合は別途 AddRef してインスタンスを保持しておきます) pNotificationService->Release(); } pService->Release(); }
最終更新日: 2015/12/30