質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

2069閲覧

Win10(1909)でタッチキーボードの状態を取得したい

hizuh

総合スコア14

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/02/16 15:28

編集2020/02/16 23:20

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/16 16:31

見つけたサンプルとは例えば以下、でしょうか。複数の回答中に同様のコードが見受けられます。 Determine if Windows 10 Touch Keyboard is Visible or Hidden https://stackoverflow.com/questions/47187216/determine-if-windows-10-touch-keyboard-is-visible-or-hidden?noredirect=1&lq=1 こちらの回答者さんによると、もともと未公開のCOM APIのようなので、 > I discovered yet another undocumented COM API that returns the position of the touch keyboard. 直近のWindows 10などでは使えなくなっている可能性もあります。(C#のコードでは使えているのであれば、C++でも使えるのでしょうけど) 質問者さんの使用環境(詳細なWindows バージョンなど)を明示すると、より適切なアドバイスや回答が得られやすくなると思います。
hizuh

2020/02/16 23:19

コメントありがとうございます。 はい。リンク先のサイトを参考にしています。 使用環境は、Windows10 Pro 1909を想定しています。 Githubに、同様のロジックを実装したC#のプログラムがありました。 そのプログラムは1909でも確認済みと書いてありましたので、C++の実装の問題だと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問