Win10 Pro 1909でタッチキーボードの状態を取得したいと考えています。
下記の通り、C#でCOMを使用したサンプルを見つけました。
プログラムを実行する環境の都合上、C#を使用することができないため、
なんとかC++で実装したいのですが、C#、C++ともに知識が乏しく、困っています。
C#
1[ComImport, Guid("228826af-02e1-4226-a9e0-99a855e455a6")] 2class ImmersiveShellBroker 3{ 4} 5 6[ComImport, Guid("9767060c-9476-42e2-8f7b-2f10fd13765c")] 7[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 8interface IImmersiveShellBroker 9{ 10 void Dummy(); 11 IInputHostManagerBroker GetInputHostManagerBroker(); 12} 13 14[ComImport, Guid("2166ee67-71df-4476-8394-0ced2ed05274")] 15[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 16interface IInputHostManagerBroker 17{ 18 void GetIhmLocation(out Rect rect, out DisplayMode mode); 19} 20 21[StructLayout(LayoutKind.Sequential)] 22struct Rect 23{ 24 public int Left, Top, Right, Bottom; 25} 26 27enum DisplayMode 28{ 29 NotSupported = 0, 30 Floating = 2, 31 Docked = 3, 32} 33 34// do this once: 35var brokerClass = new ImmersiveShellBroker(); 36var broker = (IImmersiveShellBroker)brokerClass; 37var ihm = broker.GetInputHostManagerBroker(); 38Marshal.ReleaseComObject(broker); 39 40// now ihm reference can be cached and used later: 41Rect rect; 42DisplayMode mode; 43ihm.GetIhmLocation(out rect, out mode);
上記のC#のサンプルを、次のようにC++で実装してみたのですが、(3)の箇所でエラーとなってしまいます。
エラーコードが「E_NOINTERFACE」のため、IInputHostManagerBrokerインタフェースの取得に失敗していることは
わかるのですが、対処方法がわかりません。
C#のサンプルの「IInputHostManagerBroker GetInputHostManagerBroker();」の箇所をC++で実装する部分の
問題だと考えていますが、対処方法をご教示いただけないでしょうか。
C++
1// 228826af-02e1-4226-a9e0-99a855e455a6 2DEFINE_GUID(CLSID_ImmersiveShellBroker, 3 0x228826af, 0x02e1, 0x4226, 0xa9, 0xe0, 0x99, 0xa8, 0x55, 0xe4, 0x55, 0xa6); 4 5// 9767060c-9476-42e2-8f7b-2f10fd13765c 6DEFINE_GUID(IID_IImmersiveShellBroker, 7 0x9767060c, 0x9476, 0x42e2, 0x8f, 0x7b, 0x2f, 0x10, 0xfd, 0x13, 0x76, 0x5c); 8 9// 2166ee67-71df-4476-8394-0ced2ed05274 10DEFINE_GUID(IID_IInputHostManagerBroker, 11 0x2166ee67, 0x71df, 0x4476, 0x83, 0x94, 0x0c, 0xed, 0x2e, 0xd0, 0x52, 0x74); 12 13struct Rect 14{ 15 int Left, Top, Right, Bottom; 16}; 17 18enum DisplayMode 19{ 20 NOTSUPPORTED = 0, 21 FLOATING = 2, 22 DOCKED = 3, 23}; 24 25bool IsOpened() 26{ 27 HRESULT hr; 28 hr = CoInitialize(0); 29 IImmersiveShellBroker* pIFImmersiveShellBroker; 30 IInputHostManagerBroker* pIFInputHostManagerBroker; 31 Rect rect; 32 DisplayMode displayMode; 33 34 // (1) 35 hr = CoCreateInstance( 36 CLSID_ImmersiveShellBroker, 0, 37 CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER, 38 IID_IImmersiveShellBroker, (void**)&pIFImmersiveShellBroker); 39 // (2) 40 hr = pIFImmersiveShellBroker->QueryInterface( 41 IID_IInputHostManagerBroker, (void**)&pIFInputHostManagerBroker); 42 // (3) 43 pIFInputHostManagerBroker->GetIhmLocation(&rect, &displayMode); 44 pIFImmersiveShellBroker->Release(); 45 pIFInputHostManagerBroker->Release(); 46 CoUninitialize(); 47}
あなたの回答
tips
プレビュー