• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ブラウザなどで入力された文字列を取得する方法)

ブラウザなどで入力された文字列を取得する方法

このQ&Aのポイント
  • ブラウザやワードのようなアプリケーションで入力された文字列をプログラムで取得する方法を探しています。
  • プログラム内で用意したテキストボックスに入力された文字列を取得するサンプルコードはそこかしこで見かけるのですが、他のアプリケーションで入力した文字列を取得するような方法がどうしてもわかりません。
  • 文字列を取得するImeAPIの中のImmGetCompositionStringの存在やアクティブウインドウのハンドルを取得するGetActiveWindowの存在は知っているのですが、この2つを組み合わせて出来るものなのでしょうか? ほかにも「フック」を使うという方法も考えましたがIMEで入力が確定した文字列を「フック」してくることは可能なのでしょうか? 「これなら取得できる」といった良い方法があれば教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

#1です。 読み返してみてたら、なんか大きく勘違いした事を書いてました(^^ゞ 何と勘違いしたのか、自分でも良く判りません…VB辺りの言語固有の機能と記憶が混じったかも…。 GetActiveWindowは、自分のアプリのスレッド内でアクティブなウィンドウハンドルを取得するものでしたね。 トップレベルウィンドウではありませんでしたが、自スレッド内のみなので、他アプリのウィンドウハンドルは取得できませんね。 GetForegroundWindowであれば、フォーカスを持ったウィンドウハンドルが取得できますね。 それが子ウィンドウであるか否かは関係ないです。 ボタンを押すと…のようにユーザーが操作する必要がある場合、自アプリのウィンドウにフォーカスが移ってしまう為この関数は使えません。今回のように、常駐してフォーカスを持ったウィンドウを監視するという目的の場合には使えます。 GetCaretPosは、ウィンドウ内の相対位置を取得するもののようなので使えないんじゃないでしょうか? 工夫をすれば使えるのかも知れませんが、わざわざ苦労する価値はないように思います。

tekityuu449
質問者

お礼

いろいろ関数について教えていただいてありがとうございました^^ とてもわかりやすかったです

その他の回答 (1)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

他プログラムという事で、 SendMessage で WM_GETTEXT を送れば取得できますね。 適切なウィンドウハンドルを取得するのに工夫は必要だとは思いますが。 GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって取得するかという事ですね。 GetCursorPosと、WindowFromPointを組み合わせるのが有効でしょうか。 もしくは、EnumChildWindows。 どういう機能が欲しいかという内容次第ですね。 あと、秀丸エディタなどのように、エディタ機能を完全自作している場合には取得できない可能性も高いです。 ※秀丸エディタはあくまでエディタ機能を完全自作しているという一例として名前をあげました。 秀丸エディタがWM_GETTEXTに値を返さない事を確認した、という意味ではありません。 値を返すか否かは未確認です。 エディタ機能を完全自作していても、WM_GETTEXTに値を返すように作っていれば当然値は取得できます。

tekityuu449
質問者

お礼

素早い回答ありがとうございます。 >GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、 >その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって >取得するかという事ですね。 これはWEBブラウザでいうならGetActiveWindowは大本のウィンドウを指していて テキストを入力できるウィンドウを指しているわけではないということですか? >どういう機能が欲しいかという内容次第ですね。 漢字学習支援のシステムを作ろうとしています 今作っているのはテキスト入力できるアプリケーションで、入力された文字列内の漢字だけを取得してくる部分です

tekityuu449
質問者

補足

テキスト入力を受け付ける子ウィンドウのハンドルを取得する方法に関して 先ほどGetCursorPosについて調べていて GetCursorPosの代わりにGetCaretPosを使うことを思いつきました(文字入力のみを監視したいため) これに先ほど教えていただいたWindowFromPointを組み合わせる方法は有効でしょうか? 面倒だとは思いますが、回答よろしくお願い致します 【補足説明】 上の今作ろうとしているプログラムの説明で 「入力された文字列内の漢字だけを取得してくる」と書いていますが これを常駐化して、いろいろなアプリケーションでの入力をすべて監視したいと考えています