在做3D漫游時,分別運用WASD和方向鍵,控制視角前後左右,KeyDown事件記錄漫游開始標記,但是WASD可以Debug進入,方向鍵卻始終無法進入,很奇怪的是,進不了KeyDown,卻能響應KeyUp事件 但是Ctrl+方向鍵和Alt+方向鍵卻可以進入,經過一番查找。很多文章中分析可能是因為方向鍵 ...
在做3D漫游時,分別運用WASD和方向鍵,控制視角前後左右,KeyDown事件記錄漫游開始標記,但是WASD可以Debug進入,方向鍵卻始終無法進入,很奇怪的是,進不了KeyDown,卻能響應KeyUp事件
但是Ctrl+方向鍵和Alt+方向鍵卻可以進入,經過一番查找。很多文章中分析可能是因為方向鍵預設是用來處理控制項焦點移動,由控制項自己處理,暫時沒有權威說法,但此問題是按下述套路解決的。
Control::ProcessDialogKey這個函數可以告訴程式案件時由控制項自己處理還是寫的程式來處理
This method is called during message preprocessing to handle dialog characters, such as TAB, RETURN, ESC, and arrow keys.This method is called only if the IsInputKey method indicates that the control is not processing the key.The ProcessDialogKey simply sends the character to the parent's ProcessDialogKey method, or returns false if the control has no parent.The Form class overrides this method to perform actual processing of dialog keys.This method is only called when the control is hosted in a Windows Forms application or as an ActiveX control.
大概意思就是TAB, RETURN, ESC, and arrow keys這幾個鍵是控制項自己處理,但是重寫以後可以自定義處理。(我只是理解他的意思,但做不到準確翻譯,表達能力有限)。
解決方案就是,遇到方向鍵,return false,那麼控制項就不會自動處理,交給KeyDown響應了。
C#代碼
protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right) { return false; } else { return base.ProcessDialogKey(keyData); } }
C++/CLI代碼
virtual bool ProcessDialogKey( System::Windows::Forms::Keys keyData)override { if (keyData == System::Windows::Forms::Keys::Up || keyData == System::Windows::Forms::Keys::Down || keyData == System::Windows::Forms::Keys::Left || keyData == System::Windows::Forms::Keys::Right) { return false; } else { return __super::ProcessDialogKey(keyData); } }