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


たく  2007-12-04 02:36:05  No: 67090

WindowsXP VC++2005 Win32API です。

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

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

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

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

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

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

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

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


夏みかん  2007-12-04 06:55:06  No: 67091

次のサイトを参考にして下さい。
http://homepage2.nifty.com/DSS/VCPP/OTHER/OtherFocusWindow.htm


たく  2007-12-05 09:25:33  No: 67092

お返事ありがとうございます。

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

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

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

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

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


夏みかん  2007-12-06 22:14:56  No: 67093

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


n  2007-12-06 23:49:25  No: 67094

GetGUIThreadInfo(), GUITHREADINFO.hwndFocus, GUITHREADINFO.hwndCaret
WM_GETDLGCODE, DLGC_HASSETSEL, DLGC_WANTCHARS
あたりでどうでしょうか


たく  2007-12-07 04:53:01  No: 67095

お返事ありがとうございます。

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


夏みかん  2007-12-07 06:13:39  No: 67096

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


RAPT  2007-12-07 09:17:29  No: 67097

Spy++ で見てみればよいかと。


たく  2007-12-08 03:04:48  No: 67098

>クライアント領域外でもエディットボックスならクラス名が "Edit"、コンボボックスならクラス名が "ComboBox" だと思うよ。andSpy++ で見てみればよいかと。

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


n  2007-12-08 20:46:12  No: 67099

GetClassName()でクラス名を取得できますが、Editのクラス名は
DelphiとBCBでは"TEdit"
VB6では"ThunderRT6TextBox"
になっていたりします


たく  2007-12-10 01:55:25  No: 67100

お返事ありがとうございます。返事遅くなり申し訳ありません。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加