フォーカスがテキスト フィールドに入ったときに通知を設定するための解決策を考え出そうとしています。念頭に置いている最終目標は、スクリーン キーボードを備えたモバイル デバイスで見られるタイプの機能を再現することです。
これまでのところ、とを使用して調査SetWinEventHook
してきました。 EVENT_OBJECT_FOCUS
GetGUIThreadInfo
GUI_CARETBLINKING
ドキュメントから:
EVENT_OBJECT_FOCUS
オブジェクトがキーボード フォーカスを受け取りました。システムは、次のユーザー インターフェイス要素に対してこのイベントを送信します: リスト ビュー コントロール、メニュー バー、ポップアップ メニュー、スイッチ ウィンドウ、タブ コントロール、ツリー ビュー コントロール、およびウィンドウ オブジェクト。
GUI_CARETBLINKING キャレットの点滅状態。このビットは、キャレットが表示されている場合に設定されます。
これらの方法を使用して、この解決策を思いつきました。
void TextInputHelper::setupEventHook(FREContext iCtx)
{
ctx = iCtx;
CoInitialize(NULL);
evHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_END, NULL,
handleEventObjectFocus, 0, 0,
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
}
void CALLBACK handleEventObjectFocus(HWINEVENTHOOK hook, DWORD evt, HWND hwnd,
LONG idObj, LONG idChild, DWORD thread, DWORD time)
{
GUITHREADINFO threadInfo;
threadInfo.cbSize = sizeof(GUITHREADINFO);
BOOL result = GetGUIThreadInfo(thread, &threadInfo);
if(threadInfo.flags & GUI_CARETBLINKING)
{
//text field focus
}
}
これは場合によってはうまくいくように見えますが、確実に信頼できるものではありません。メモ帳や IE などのプログラムは正常に動作するようですが、Firefox などのプログラムは動作しません。これは、呼び出されるように見えないため、Web サイトのテキスト フィールドなどでは機能しませんhandleEventObjectFocus
。
この問題にアプローチする別の方法を知っている人はいますか? 私は周りを検索してきましたが、アクセシビリティ API で何かを探しているようですが、あまり掘り下げることができませんでした。
ありがとう!
編集
明確にするために、フォーカスがテキストフィールドに入ったときに通知を受け取ることを期待しています。このアプリケーションは win32 dll であり、自分自身にフォーカスすることはありません。