C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: キーのカスタマイズ


(過去ログ 130 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■76832 / inTopicNo.1)  キーのカスタマイズ
  
□投稿者/ Hays tomato (1回)-(2015/08/23(Sun) 23:40:30)

分類:[C#] 

いつもお世話になっています。
C#にてシステムのイベントキーをユーザが設定出来るようにしたいのですが、方法を教えて下さい。
イメージとしては下記プログラムのKeys.AをKeys.BやKeys.Cにユーザが変更出来るようにしたいです。
宜しくお願いします。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{ if (e.KeyCode == Keys.A )
{
◯◯
}
}

引用返信 編集キー/
■76833 / inTopicNo.2)  Re[1]: キーのカスタマイズ
□投稿者/ Hongliang (330回)-(2015/08/24(Mon) 00:22:34)
単純な方法としては、DictionaryとActionを組み合わせることでしょうか?

Dictionary<Keys, Action> keyActions;

void InitKeys() { // 起動時などにキーを初期化する
  KeysConverter conv = new KeysConverter();
  foreach (var setting in ...) { // settingはKeyとActionという2つのstringを持ってるとする
    Keys key = (Keys)conv.ConvertFromString(setting.Key);
    // さすがに直接GetMethodは色々問題があるのでここはもうちょっとなんとかする
    Action action = (Action)Delegate.CreateDelegate(this.GetType().GetMethod(setting.Action));
    keyActions[key] = action;
  }
}

void Form1_KeyDown(object sender, KeyEventArgs e) {
  Action action;
  if (keyActions.TryGetValue(e.KeyCode, out action)) {
    action();
  }
}

引用返信 編集キー/
■76834 / inTopicNo.3)  Re[1]: キーのカスタマイズ
□投稿者/ ぶなっぷ (42回)-(2015/08/24(Mon) 10:28:43)
2015/08/24(Mon) 11:13:39 編集(投稿者)
Hongliangさんの話し通り、処理そのもの(Action)を辞書化(Dictionary)にしてもいいですし、
単にKeyCodeを実際の処理に対応する値(enum等)に置き換えるだけでもいいです。

以下のコードは実行チェックしてないので間違ってたらすいません。

enum ActionEnum
{
    None,
    Open,
    Close,
    Send,
    Receive
}

Dictionary<Keys, ActionEnum> ActionEnums = new Dictionary<Keys, ActionEnum>();

// コンストラクタ
public Form1()
{
    ActionEnums.Add(Keys.O, ActionEnum.Open);
    ActionEnums.Add(Keys.C, ActionEnum.Close);
    ActionEnums.Add(Keys.S, ActionEnum.Send);
    ActionEnums.Add(Keys.R, ActionEnum.Receive);
}

// KeyDown
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    ActionEnum ActionEnum;
    ActionEnums.TryGetValue(e.KeyCode, out ActionEnum);
    if(ActionEnum == ActionEnum.None) return;
    switch(ActionEnum)  // 選択肢が静的に決まる場合はif()文よりswitch()文の方が高速
    {
        case ActionEnum.Open:    Open();    break;
        case ActionEnum.Close:   Close();   break;
        case ActionEnum.Send:    Send();    break;
        case ActionEnum.Receive: Receive(); break;
    }
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -