ある1つの難しい問題に対処することになります。バンドオブジェクトが明示的にキー入力を検出しなければならないというものです。Aを押下した場合は全ての文字列が選択されることが望みます。Aの通知が送られるようになっています。方向キーやBackキー、Delキーの押下もフォーカスを持っているコントロールに送られません。明示的にキー入力を検出する処理が必要になります。バンドオブジェクトのフォーカスが変化した際にIEへ通知するようにします。これにより、IEはキー入力に関する通知をバンドオブジェクトへ送るようになります。これをCToolBand::SetSiteで取得しておきます。QueryInterfaceにはIID_IInputObjectSiteが指定されることになります。この結果、IInputObjectSiteを取得することができます。バンドオブジェクトにフォーカスが割り当てられた際というのは、どのような状況のことを意味するのでしょうか。このエディットコントロールにフォーカスが割り当てられた際を検出すればよいでしょう。EN_KILLFOCUS)OnFocus(FALSE);else;}wParamの下位ワードがID_EDITであるならば、エディットコントロールに関する通知であることが分かります。EN_KILLFOCUSならばフォーカスを失われたことを意味します。OnFocusという自作メソッドは、フォーカスの有無を受け取って次の処理を行います。m_bHasFocus);}現在のフォーカスの状態は後でIEに返すことになるため、メンバ変数に保存しておくようにします。キー入力を受け取るオブジェクトをIEに渡すことができます。このオブジェクトはIInputObjectを実装していなければならず、上記ではthisポインタを指定しています。よって、CToolBandはIInputObjectを実装し、QueryInterfaceでこれを返すようになっていなければなりません。IEは、IInputObjectを通じて入力に関する通知をオブジェクトに送ります。このうちUIActivateIOとHasFocusIOの処理は次のようになります。それがどのようなタイミングで発生するのかがよく分かりません。調べたところ、オブジェクトをメニューから表示した場合やタブキーでフォーカスが割り当てた場合には呼ばれませんでした。HasFocusIOは何かキーが入力された際に呼ばれます。ここでは現在のフォーカスの状態を返すことになるため、OnFocusで保存したメンバ変数の値を参照します。HasFocusIOでS_OKを返すと、TranslateAcceleratorIOが呼ばれるようになります。S_FALSEを返すと入力されたキーをコントロールに送信します。単純にS_FALSEを返すだけではそのような動作は実現できません。これらのキーが入力された場合は明示的にコントロールへそれを送信することになります。このように独自にキーを処理した場合はS_OKを返すようにします。それでは各種処理を順に見ていきます。nEntries);}アクセラレータの入力を検出するために、CreateAcceleratorTableでアクセラレータテーブルを作成します。切り取りを意味するCtrl+X(0x58)、コピーを意味するCtrl+C(0x43)、貼り付けを意味するCtrl+V(0x56)の合計5個です。Ctrlキーの組み合わせであるためFCONTROLも指定します。S_OK;}}}入力されたキーがWM_KEYDOWNである場合は、押下されたキーをwParamから確認することになります。Delキー及び方向キーに関しては、lpMsg->hwndにWM_KEYDOWNを送るだけで構いません。Backキーに関してはWM_CHARを送るようにします。ある場合は入力されたキーに応じた処理を実行します。EM_SETSELのWPARAMに0を指定してLPARAMに-1を指定します。残りのキーについては、その動作の通りのメッセージを送信します。今回の場合lpMsg->hwndはエディットコントロールのウインドウハンドルになります。