多分、この手の質問は過去ログを見ればあるのでしょうが、あまりにログがあり検索に
断念してしまったため、失礼を承知で新規という形で質問させて頂きたいと思います。
VC++ .NET MFC です。
ダイアログ上でEnterキーまたはESCキーを押下するとダイアログが閉じてしまうのです
が、どうすれば回避できるのでしょうか?
すみませんがよろしくおねがいいたします。
一番上の例だと終了できなくなってしまうし、
PreTranslateMessage は、しらんでいじると副作用が怖いし・・・
OnCancel() をオーバーライドして
::GetKeyState(VK_ESCAPE)
を使用してESCキーが押されている場合終了できなくする。
ちなみに OnOK の場合はリターンキー。
これの方が一番お手軽では?
(ちがってたらごめんなさい)
IDOKのイベントでOnOKのようにして
CDialog::OnOK();
をコメントにすればEnterは回避できますね。
あんまり良くないかもしれませんが、
ESCの方は WM_CLOSE と IDCANCEL のイベントの
OnClose と OnCancel でどうにかできると思います。
閉じる、ALT+F4は
OnClose ⇒ OnCancel
Escは
OnCancel
が呼ばれるので、OnCloseでフラグセットして
OnCancelで判断という方法でもできるような。
ただしこの方法がいいのか悪いのかはちょっとわかりません(;^_^A
> CDialog::OnOK();
> をコメントにすればEnterは回避できますね。
コメントアウトしてしまうと、OKボタンをマウスで押しても
ダイアログが終了しなくなってしまうのでは?
ああ・・・そもそも、OKボタンが必要ないならそれでいいのかな。
そうだったら、YOU さんのコメントアウトする方法が一番簡単ですね。
そもそも、EnterとESCで閉じないダイアログは
Windowsの作法に反してますが・・・
純粋にEnterキーとESCキーの検知したいのであれば
PreTranslateMessage以外に方法は無いのではないかと思います。
はじめましてBosscatと申します。
たまたま立ち寄ったので、ついでに辻レスを・・・
ダイアログを閉じずに何がしたいかに拠るのですが・・・
まあ、仕事ならば、何でも有りで作法云々も言ってられないことがありますよね(TT;
もし、ダイアログWindowループに依存したく無い処理が必要であれば
(あまり想像できませんが、、、Windowのキーイベントは当然試した後だと思うので)
キーフックという手もあります。
が、こんなモノに頼るようだと、その考え方自体が間違っていると思うので
最終手段だと思ってください。
こんな感じ
HHOOK hKHook_=SetWindowsHookEx( WH_KEYBOARD,(HOOKPROC)KHookProc,hWnd,0);
ちなみにDLL化してあげるとWindows全体からキーイベントが取れます。
前に「猫でもわかる」で解説していた気がする・・・
みなさま、どうもありがとうございます。
いろいろなやり方を示していただいたので検討して採用させていただきます