- ベストアンサー
WM_KEYDOWNが拾えない(EditBox関連)
- メインウィンドウに子ウィンドウを貼り付けデータを表示させる方法について質問があります。
- 子ウィンドウでのWM_KEYDOWNが拾えない問題があり、親ウィンドウでWM_KEYDOWNを送信しているが、エディットボックスを破棄した後方向キーでの移動ができなくなる現象が発生しています。
- EditBoxをサブクラス化してリターンキーで閉じるようにしていますが、解決策をご教示ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。 ウィンドウプロシージャから見たSend時の処理の流れ WM_KEYDOWNの受け取り ↓ WM_CLOSEの受け取り ↓ WM_CLOSEに対する処理 ↓ WM_KEYDOWNに対する処理 Post時の処理の流れ WM_KEYDOWNの受け取り ↓ WM_KEYDOWNに対する処理 ↓ WM_CLOSEの受け取り ↓ WM_CLOSEに対する処理 これで違いはわかりますか? Sendしてしまうと、WM_CLOSEの処理が行われた後で WM_KEYDOWNに対する内部処理がエディットのウィンドウプロシージャ内で行われます。 ここはブラックボックスなので、何が行われているかは わからないですが、フォーカスに関係するような処理でも 行われているのでしょう。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。 参考までに、何が持ってました? ハンドル値がわかればSPYで調べられますよね。 >サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時に >SetFocusしてもだめでした。 どのタイミングでSetFocusしました? WM_KEYDOWN?WM_DESTROY? タイミングをずらせばいいのであれば、WM_DESTROYのときに親ウィンドウにWM_USERかなんかをPOSTしてあげれば何とかなると思います。
お礼
>>...POSTしてあげれば何とかなると思います。 今まで何も考えずにSendMessageばかり使ってましてそれでも何とかなっていたのでPostとSendの違いを深く理解していませんでした。 taka_tetsuさんの言葉をきっかけにPostMessageについて調べ直し、直ちに制御を返すことに気づき使ってみました。 結果、WM_CLOSEをSendではなくPostしたらSetFocusするまでもなく親ウィンドウにフォーカスが移り、キー操作もちゃんと拾えるようになりました。(初歩的なことでお恥ずかしい) ただ、以前のようにWM_KEYDOWNでWM_CLOSEを"SEND"した場合、(EditBoxプロシージャ内の)どこでSetFocusしてもだめだった理由がいまひとつ理解できていないのでちょっとすっきりしませんが...。 いずれにしても解決への糸口を提供していただきまして今回の件だけでなく今後のデバッグのためにも参考になりました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>移動は子ウィンドウでWM_KEYDOWNが拾えなかったので 子ウィンドウは、もしかしてスタティックなコントロールとか使用していませんか? >入力が終わりエディットボックスを破棄した後、以前のように方向キーでの移動が出来なくなってしまいました。親ウィンドウでWM_KEYDOWNを拾えていないようです。 キーで動かないのは子ウィンドウがキーボードフォーカスを持ってない体と思われます。なんで、エディットを破棄した後にSetFocusすれば平気かも。 それでもだめなときは、キーボードフォーカスはどこにあるかGetFocusで調べてみてください。 このときに、デバッグ用にメッセージボックスなどフォーカスの移動が 発生するようなものは表示させないでくださいね。
お礼
ありがとうございます。早速、GetFocusで調べてみました。EditBox破棄後、EditBoxにあったフォーカスは親(子)ウィンドウには戻りませんでした。ご指摘のとおりEditBox破棄後、別のタイミングでSetFocusすれば元に戻りましたが、サブクラス化したEditBoxのプロシージャ内でリターンキーによりEditBox自身を閉じた時にSetFocusしてもだめでした。今の状態だと 編集する → リターンキーで編集を終える → 方向キーが使えない ということになってしまいます。 ちなみに子ウィンドウはCreateWindowで作ったWM_CHILDのタイトルなしのウィンドウです。
お礼
ありがとうございます。 順を追って流れを見ると違いがはっきり分かりました。 taka_tetsuさんのおかげで基本的かつ重要なことを学べました。