ブラウザやワードのようなアプリケーションで入力された文字列(特に漢字)をプログラムで取得する方法を探しています。
プログラム内で用意したテキストボックスに入力された文字列を取得するサンプルコードはそこかしこで見かけるのですが、
他のアプリケーションで入力した文字列を取得するような方法がどうしてもわかりません
文字列を取得する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 …
No.2ベストアンサー
- 回答日時:
#1です。
読み返してみてたら、なんか大きく勘違いした事を書いてました(^^ゞ
何と勘違いしたのか、自分でも良く判りません…VB辺りの言語固有の機能と記憶が混じったかも…。
GetActiveWindowは、自分のアプリのスレッド内でアクティブなウィンドウハンドルを取得するものでしたね。
トップレベルウィンドウではありませんでしたが、自スレッド内のみなので、他アプリのウィンドウハンドルは取得できませんね。
GetForegroundWindowであれば、フォーカスを持ったウィンドウハンドルが取得できますね。
それが子ウィンドウであるか否かは関係ないです。
ボタンを押すと…のようにユーザーが操作する必要がある場合、自アプリのウィンドウにフォーカスが移ってしまう為この関数は使えません。今回のように、常駐してフォーカスを持ったウィンドウを監視するという目的の場合には使えます。
GetCaretPosは、ウィンドウ内の相対位置を取得するもののようなので使えないんじゃないでしょうか?
工夫をすれば使えるのかも知れませんが、わざわざ苦労する価値はないように思います。
No.1
- 回答日時:
他プログラムという事で、
SendMessage で WM_GETTEXT を送れば取得できますね。
適切なウィンドウハンドルを取得するのに工夫は必要だとは思いますが。
GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって取得するかという事ですね。
GetCursorPosと、WindowFromPointを組み合わせるのが有効でしょうか。
もしくは、EnumChildWindows。
どういう機能が欲しいかという内容次第ですね。
あと、秀丸エディタなどのように、エディタ機能を完全自作している場合には取得できない可能性も高いです。
※秀丸エディタはあくまでエディタ機能を完全自作しているという一例として名前をあげました。
秀丸エディタがWM_GETTEXTに値を返さない事を確認した、という意味ではありません。
値を返すか否かは未確認です。
エディタ機能を完全自作していても、WM_GETTEXTに値を返すように作っていれば当然値は取得できます。
この回答への補足
テキスト入力を受け付ける子ウィンドウのハンドルを取得する方法に関して
先ほどGetCursorPosについて調べていて
GetCursorPosの代わりにGetCaretPosを使うことを思いつきました(文字入力のみを監視したいため)
これに先ほど教えていただいたWindowFromPointを組み合わせる方法は有効でしょうか?
面倒だとは思いますが、回答よろしくお願い致します
【補足説明】
上の今作ろうとしているプログラムの説明で
「入力された文字列内の漢字だけを取得してくる」と書いていますが
これを常駐化して、いろいろなアプリケーションでの入力をすべて監視したいと考えています
素早い回答ありがとうございます。
>GetActiveWindowではトップレベルのウィンドウハンドルを取得するので、
>その子ウィンドウとしてのテキスト入力欄のウィンドウハンドルはどうやって
>取得するかという事ですね。
これはWEBブラウザでいうならGetActiveWindowは大本のウィンドウを指していて
テキストを入力できるウィンドウを指しているわけではないということですか?
>どういう機能が欲しいかという内容次第ですね。
漢字学習支援のシステムを作ろうとしています
今作っているのはテキスト入力できるアプリケーションで、入力された文字列内の漢字だけを取得してくる部分です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
最近、いつ泣きましたか?
泣いてストレス発散! なんて言いますよね。 あなたは最近いつ、どんなシチュエーションで泣きましたか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
アクティブウインドウのIMEコンテキスト取得を取得したい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
VBA .Value=.Value ?
-
ラジオボタンの初期指定
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
[VBA] UserForm を Excel の W...
-
勝手にウィンドウが開いて止ま...
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
VBA SendMessage 無限ループに...
-
Alt+P,Alt+NをPostmessageで送...
-
UWSCで特定のChromeのタブをア...
-
親ウインドウにあるOKボタンを...
-
ExcelVBA:フォームの最小化ボ...
-
C++のクラス内で、ウインドウプ...
-
Visual Studioの画面で
-
ボタンのハンドルウィンド取得...
-
SendMessage関数がうまく動作し...
-
Msgboxの変数の表示につ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ExcelのBOOKが消えた!
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
VBA .Value=.Value ?
-
Vba LongPtrについて教えてくだ...
-
Excelの上下を固定したい
-
Alt+P,Alt+NをPostmessageで送...
-
[VBA] UserForm を Excel の W...
-
作成したウインドウのサイズを...
-
「&HFFFF」「&H1A」とは?
-
MFC ダイアログ上のID取得につ...
-
親ウインドウにあるOKボタンを...
-
ダイアログをスクロールさせるには
-
【VB2008】 マウス操作の一時的...
-
EnumChildWindowsの使い方(VBA)
-
名前を付けて保存のウィンドウ...
おすすめ情報