2016-04-05 9 views
1

C++ WinAPIで仮想キーボードを開発しています。明らかに、編集コントロールにフォーカスがあるときに仮想キーボード(VK)ウィンドウを表示できるようにする必要があります。ユーザーがVKのキーを押すと、プログラムはその文字を他のプロセスEditコントロールに挿入する必要があります。これらはセキュリティ上の懸念を示しており、Windows OSでは不可能な場合もあります。したがって、私の質問...編集コントロールのフォーカスを検出して文字を挿入する

  • 他のプロセスのEditコントロールがフォーカスしていることを知ることはできますか?フックが解決策になるかもしれないと思っています。グローバルフックを使用するとセキュリティ上の懸念がありますが、OSには「編集」のコントロールにフォーカスがあるときだけ教えてください。私が知らない別の方法がありますか?

  • 他のプロセスに文字を挿入することはできますか?これは、セキュリティ/エチケットに関する懸念を再び提示する。

答えて

2

それは別のプロセスでのエディットコントロールにフォーカスがあるときを知ることは可能ですか?

はい、ただし直接はありません。実際にはフックが必要です(SetWindowsHookEx()またはSetWinEventHook())。

SetWindowsHookEx()で、他のプロセスをフックするには、フックをDLL(および32ビットおよび64ビットシステムのDLLを別々にする)に実装する必要があります。 HCBT_SETFOCUS通知を探してWH_CBTフックを使用するか、WM_SETFOCUS/WM_KILLFOCUSウィンドウメッセージを探してWH_CALLWNDPROCフックを使用することができます。

SetWinEventHook()では、他のプロセスをフックするDLLは必要ありません。 EVENT_OBJECT_FOCUSイベントを受信するために登録することができます(ただし、フォーカスの損失を検出するためのフックイベントは表示されません)。

私はちょうどOSに言うことができる方法があります 'タイプ'のコントロールのコントロールがフォーカスを持っているときに教えてください?

編集は、具体的に制御フィルタする番号、あなたのフックが知られている編集クラス(すべてではないエディットコントロールが"EDIT"命名されている)を探すために提供さHWNDGetClassName()を呼び出す必要があります。

他のプロセスに文字を挿入することはできますか?

はい。 SendInput()またはkeybd_event()を使用すると、キーボードドライバ自身が投稿するのと同じ入力キューにキーストロークを投稿できます。 Editコントロールにフォーカスがある限り、ユーザーが通常通り入力したかのようにキーストロークを受け取ります。これは、の好ましいアプローチです。

しかし、フックはエディットコントロールのHWNDをご提供しますので、あなたは(:You can’t simulate keyboard input with PostMessage、およびSimulating input via WM_CHAR messages may fake out the recipient but it won’t fake out the input system、しかし、これらの落とし穴に注意)エディットコントロールに直接WM_KEYDOWN/WM_CHAR/WM_KEYUPメッセージを送ることができます。また、AccessibleObjectFromWindow()を介してWM_GETTEXT/WM_SETTEXTメッセージをEditコントロールに送信したり、IAccessibleインターフェイスを取得して、必要に応じてEditコントロールのテキストコンテンツを操作することもできます。

関連する問題