KeysのkeyData完全攻略! 修飾キーを分解・分類
ProcessCmcKey(Keys keyData)で修飾キー
このKeyDataでswitch()するときにcase文に
「A」キー を以下のキーとの組み合わせ
Shift と Ctrlキー (両方)
Shift (片方)
のどちらも来るように書こうとすると、だんだんとcase文が膨大になっていきます。
この問題を解決する方法です。
keys.A とshiftの有無、ctrlの有無、の変数に分けます。
(Keys)keyData に対して
bool is_alt = *1;
Keys keyData_NoMod = (keyData_NoMod == Keys.Alt) ? keys.None : keyData_NoMod;
Keys keyData_NoMod = (keyData_NoMod == Keys.Control) ? keys.None : keyData_NoMod;
Keys keyData_NoMod = (keyData_NoMod == Keys.Shift) ? keys.None : keyData_NoMod;
ここまで処理をすると、の場合、Shiftキー「だけ」が押されたときは keys.Shift が入ります。(修飾ではなく単独キーという考えらしい)
単独のShiftキーのとき keyData_NoMod がKeys.Noneとなるようにするには
これでOKです。
keyData_NoMod には keys.A のみが入っているので case keys.A: と書けます。
修飾キーの組み合わせで場合分けが必要なら
A_key_proccess(In_is_shift:is_shift, In_is_ctrl:is_ctrl);
のように、処理関数に修飾キー別に押下の有無を渡せばシンプルでよいと思います。
探してみると意外と無かったので、参考になればと思います。
このKeyDataでswitch()するときにcase文に
「A」キー を以下のキーとの組み合わせ
Shift と Ctrlキー (両方)
Shift (片方)
のどちらも来るように書こうとすると、だんだんとcase文が膨大になっていきます。
この問題を解決する方法です。
keys.A とshiftの有無、ctrlの有無、の変数に分けます。
(Keys)keyData に対して
bool is_alt = *1;
Keys keyData_NoMod = (keyData_NoMod == Keys.Alt) ? keys.None : keyData_NoMod;
Keys keyData_NoMod = (keyData_NoMod == Keys.Control) ? keys.None : keyData_NoMod;
Keys keyData_NoMod = (keyData_NoMod == Keys.Shift) ? keys.None : keyData_NoMod;
ここまで処理をすると、の場合、Shiftキー「だけ」が押されたときは keys.Shift が入ります。(修飾ではなく単独キーという考えらしい)
単独のShiftキーのとき keyData_NoMod がKeys.Noneとなるようにするには
これでOKです。
keyData_NoMod には keys.A のみが入っているので case keys.A: と書けます。
修飾キーの組み合わせで場合分けが必要なら
A_key_proccess(In_is_shift:is_shift, In_is_ctrl:is_ctrl);
のように、処理関数に修飾キー別に押下の有無を渡せばシンプルでよいと思います。
探してみると意外と無かったので、参考になればと思います。
*1:keyData & Keys.Alt) |
keyData == Keys.Alt) == Keys.Alt) ? true : false;
bool is_ctrl = ((keyData & Keys.Control |
keyData == Keys.Control) == Keys.Control) ? true : false;
bool is_shift = ((keyData & Keys.Shift |
keyData == Keys.Shift) == Keys.Shift) ? true : false;
// Keys keyData_NoMod には Shiftなどを除去したキーがあります。
// また、Shiftのみ押されたときは
// is_shift が true、keyData_NoMod が Keys.None となります。
Keys keyData_NoMod = (Keys)(keyData - (keyData & Keys.Modifiers