dポイントプレゼントキャンペーン実施中!

ブラウザやワードのようなアプリケーションで入力された文字列(特に漢字)をプログラムで取得する方法を探しています。
プログラム内で用意したテキストボックスに入力された文字列を取得するサンプルコードはそこかしこで見かけるのですが、
他のアプリケーションで入力した文字列を取得するような方法がどうしてもわかりません

文字列を取得するImeAPIの中のImmGetCompositionStringの存在や
アクティブウインドウのハンドルを取得するGetActiveWindowの存在は知っているのですが
この2つを組み合わせて出来るものなのでしょうか?

ほかにも「フック」を使うという方法も考えましたがIMEで入力が確定した文字列を
「フック」してくることは可能なのでしょうか?

「これなら取得できる」といった良い方法があれば教えていただきたいです。
長文になりましたがなにとぞよろしくお願いいたします。

開発環境:windows7 64bit
開発言語:できればC言語

↓テキストボックスに入力された文字列を取得するサンプルコード↓
http://shinshu.fm/MHz/95.83/archives/0000025041. …
http://www.atmarkit.co.jp/fdotnet/dotnettips/875 …

↓IME APIの関数リスト↓
http://msdn.microsoft.com/ja-jp/library/cc422019 …

A 回答 (2件)

#1です。


読み返してみてたら、なんか大きく勘違いした事を書いてました(^^ゞ
何と勘違いしたのか、自分でも良く判りません…VB辺りの言語固有の機能と記憶が混じったかも…。

GetActiveWindowは、自分のアプリのスレッド内でアクティブなウィンドウハンドルを取得するものでしたね。
トップレベルウィンドウではありませんでしたが、自スレッド内のみなので、他アプリのウィンドウハンドルは取得できませんね。

GetForegroundWindowであれば、フォーカスを持ったウィンドウハンドルが取得できますね。
それが子ウィンドウであるか否かは関係ないです。

ボタンを押すと…のようにユーザーが操作する必要がある場合、自アプリのウィンドウにフォーカスが移ってしまう為この関数は使えません。今回のように、常駐してフォーカスを持ったウィンドウを監視するという目的の場合には使えます。

GetCaretPosは、ウィンドウ内の相対位置を取得するもののようなので使えないんじゃないでしょうか?
工夫をすれば使えるのかも知れませんが、わざわざ苦労する価値はないように思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/11/28 13:42

他プログラムという事で、


SendMessage で WM_GETTEXT を送れば取得できますね。

適切なウィンドウハンドルを取得するのに工夫は必要だとは思いますが。
GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって取得するかという事ですね。

GetCursorPosと、WindowFromPointを組み合わせるのが有効でしょうか。
もしくは、EnumChildWindows。
どういう機能が欲しいかという内容次第ですね。

あと、秀丸エディタなどのように、エディタ機能を完全自作している場合には取得できない可能性も高いです。

※秀丸エディタはあくまでエディタ機能を完全自作しているという一例として名前をあげました。
秀丸エディタがWM_GETTEXTに値を返さない事を確認した、という意味ではありません。
値を返すか否かは未確認です。
エディタ機能を完全自作していても、WM_GETTEXTに値を返すように作っていれば当然値は取得できます。

この回答への補足

テキスト入力を受け付ける子ウィンドウのハンドルを取得する方法に関して

先ほどGetCursorPosについて調べていて
GetCursorPosの代わりにGetCaretPosを使うことを思いつきました(文字入力のみを監視したいため)
これに先ほど教えていただいたWindowFromPointを組み合わせる方法は有効でしょうか?

面倒だとは思いますが、回答よろしくお願い致します

【補足説明】
上の今作ろうとしているプログラムの説明で
「入力された文字列内の漢字だけを取得してくる」と書いていますが
これを常駐化して、いろいろなアプリケーションでの入力をすべて監視したいと考えています

補足日時:2011/11/25 12:40
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます。

>GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、
>その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって
>取得するかという事ですね。

これはWEBブラウザでいうならGetActiveWindowは大本のウィンドウを指していて
テキストを入力できるウィンドウを指しているわけではないということですか?


>どういう機能が欲しいかという内容次第ですね。

漢字学習支援のシステムを作ろうとしています
今作っているのはテキスト入力できるアプリケーションで、入力された文字列内の漢字だけを取得してくる部分です

お礼日時:2011/11/25 11:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!