5

フォーカスがテキスト フィールドに入ったときに通知を設定するための解決策を考え出そうとしています。念頭に置いている最終目標は、スクリーン キーボードを備えたモバイル デバイスで見られるタイプの機能を再現することです。

これまでのところ、とを使用して調査SetWinEventHookしてきました。 EVENT_OBJECT_FOCUSGetGUIThreadInfoGUI_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 であり、自分自身にフォーカスすることはありません。

4

3 に答える 3

1

別のテキスト入力方法を提供しようとしている場合は、"IME" - "Input Method Editor" を調べる必要があります。これらは、OS によって直接サポートされています。

于 2013-01-18T15:32:24.477 に答える
1

標準の Windows コントロールを使用している場合は、 WM_SETFOCUSでうまくいくはずです。フッキングなどに凝る必要はありません。

編集: システム全体の動作については、 SetWindowsHookExをチェックアウトできます。システム全体のイベントをキャッチするには、DLL 内から使用する必要があります。WM_SETFOCUS をキャッチするフックを含むフックの組み合わせを使用できます。

于 2013-01-18T06:15:08.897 に答える
0

EN_SETFOCUS通知を使用して、テキスト フィールドへの入り口をキャッチできます。

WM_FOCUS はウィンドウ自体用であり、ウィンドウ内のコントロール用ではありません。別の言い方をすれば、WM_FOCUS を使用する場合は、EDIT フィールドをサブクラス化する必要があります。ここでは必要ありません。

編集: システム全体の動作が必要かどうかは完全には明らかではありませんでした。その場合、上記の回答で説明されているように、フック (SetWindowsHookEx を参照) を使用する必要があります。ごめん。

于 2013-01-18T06:41:58.190 に答える