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);
のように、処理関数に修飾キー別に押下の有無を渡せばシンプルでよいと思います。

探してみると意外と無かったので、参考になればと思います。

*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