■ 文字入力フォームにフォーカスがあることを検出するには?

[Visual C++ Q & A 掲示板] [過去ログの一覧]


たく 2007/12/03(月) 17:36:05 <初心者>
WindowsXP VC++2005 Win32API です。

検索窓やNotepadといった文字を入力することができる部分をマウスで

クリックしたら自作のウィンドを表示するようなものを作りたいのです

が文字入力部分の検出方法がわかりません。

サイトで調べているとGetForegroundWindow,AttachThreadInput,GetFocusを組

み合わせるなどかかれていたのですが使い方がいまいちわからず困っていす。

またこれでできるのかわかりません。

初心者なのでわけわからない質問をしていたらすいません;;

アドバイス宜しくお願いします。

夏みかん 2007/12/03(月) 21:55:06
次のサイトを参考にして下さい。
http://homepage2.nifty.com/DSS/VCPP/OTHER/OtherFocusWindow.htm

たく 2007/12/05(水) 00:25:33 <初心者>
お返事ありがとうございます。

参考サイトのコードを入れてみたのですが、どこをクリックしても

ハンドルをとってくるためテキストボックス等の入力部だけを取り

だすことができません。。。。

Imm32.LibのImmGetContext()やImmSetOpenStatus()なども試して

みたのですがやはり検出できません。。。

夏みかん 2007/12/06(木) 13:14:56
> ハンドルをとってくるためテキストボックス等の入力部だけを取り
ウインドウのハンドルさえ分かれば GetWindowClass でクラス名を
取得してクラス名が ComboBox、Edit なら入力できる領域と判定するのは。

n 2007/12/06(木) 14:49:25
GetGUIThreadInfo(), GUITHREADINFO.hwndFocus, GUITHREADINFO.hwndCaret
WM_GETDLGCODE, DLGC_HASSETSEL, DLGC_WANTCHARS
あたりでどうでしょうか

たく 2007/12/06(木) 19:53:01 <初心者>
お返事ありがとうございます。

>取得してクラス名が ComboBox、Edit なら入力できる領域と判定するのは。
クライアント領域外のもの(検索窓など)はクラス名が不明なので処理できません。それとも実はクラス名があるのでしょうか。

夏みかん 2007/12/06(木) 21:13:39
> クライアント領域外のもの(検索窓など)はクラス名が不明なので処理できません。それとも実はクラス名があるのでしょうか。
クライアント領域外でもエディットボックスならクラス名が "Edit"、コンボボックスならクラス名が "ComboBox" だと思うよ。

RAPT 2007/12/07(金) 00:17:29
Spy++ で見てみればよいかと。

たく 2007/12/07(金) 18:04:48 <初心者>
>クライアント領域外でもエディットボックスならクラス名が "Edit"、コンボボックスならクラス名が "ComboBox" だと思うよ。andSpy++ で見てみればよいかと。

ほんとですね!!調べるとそのとおりでした。
これでできると意気込んでビルドするとGetWindowClassの識別子が見つかりません;;
windows.hでは使えないのでしょうか。参考サイト見当たりません;;

n 2007/12/08(土) 11:46:12
GetClassName()でクラス名を取得できますが、Editのクラス名は
DelphiとBCBでは"TEdit"
VB6では"ThunderRT6TextBox"
になっていたりします

たく 2007/12/09(日) 16:55:25 <初心者>
お返事ありがとうございます。返事遅くなり申し訳ありません。

GetClassNameでクラス名を取得して識別することができました。
Notepadやoutlookなどは識別できるようになりました!!
しかし、webブラウザの検索窓を検出することができません;;

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library