2016-09-26 23 views
0

私はいくつかの機能のキーボードホットキーを設定するために私のアプリのユーザーにオプションを許可しようとしています。カスタマイズ可能なホットキー設定はどのように処理できますか?

次のように今、私はKeyDownイベントにTextBoxを使用しています:

Key Hotkey; 
private void SetHotKey(object sender, KeyEventArgs e) 
{ 
    (sender as TextBox).Text = e.Key.ToString(); 
    Hotkey = e.Key; 
    e.Handled = true; 
} 

をこのアプローチの問題は、[F4] + [Ctrl]キーと同じように、私は複雑なショートカットを設定することはできませんです。そこに役立ついくつかのサードパーティのコントロールはありますか?または、テキストボックスで購読するのに適したイベントですか?

UPDATE:私は自分のコードを変更しましたが、私はまだ何か間違ったことをやっているようです。

Key Hotkey; 
bool lControl = false; 
bool lAlt = false; 
bool lShift = false; 
private void SetHotKey(object sender, KeyEventArgs e) 
{ 
    var k = e.Key; 
    if (e.IsDown) 
    { 
     var tb = sender as TextBox; 
     tb.Text = ""; 
     lControl = Keyboard.IsKeyDown(Key.LeftCtrl); 
     lAlt = Keyboard.IsKeyDown(Key.LeftAlt); 
     lShift = Keyboard.IsKeyDown(Key.LeftShift); 
     if (lControl) tb.Text += "Ctrl+"; 
     if (lAlt) tb.Text += "Alt+"; 
     if (lShift) tb.Text += "Shift+"; 
     tb.Text = e.Key.ToString(); 
     Hotkey = e.Key; 
    } 
    e.Handled = true; 
} 

私はそれを動作させてよりきれいに見えるようにするにはどうすればよいですか?

+3

可能重複[C#/ WPF:キーボードショートカットを実装(http://stackoverflow.com/questions/3574405/c-wpf-implement-keyboard-shortcuts) – Eldho

+0

@Eldhoない正確。私は何か違うことを求めています。 – Reynevan

+0

上記の答えは、キーボードのショートカットALT + Sやこれに類するものを実装する方法を示しています。 – Eldho

答えて

2

正しい方向に向かって作業を開始するには、

まず、System/ImeProcessed/DeadCharProcessedキーの背後にある実際のキーが必要です。これは拡張メソッドを使って簡単にアクセスできます。

public static Key RealKey(this KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.System: 
      return e.SystemKey; 

     case Key.ImeProcessed: 
      return e.ImeProcessedKey; 

     case Key.DeadCharProcessed: 
      return e.DeadCharProcessedKey; 

     default: 
      return e.Key; 
    } 
} 

次に、押されたキーだけでなく、修飾キーをショートカットにフォーマットする必要があります。 Keyboard.ModifierKeysを使用してフラグを取得し、簡単な書式設定のためにリスト内のフラグを集めることができます。また、ホットキーの更新から修飾キー(Ctrl、Alt、Shift)だけをブロックする必要があります。

private void SetHotKey(object sender, KeyEventArgs e) 
{ 
    var nonShortcuttableKeys = new[] { Key.LeftAlt, Key.RightAlt, Key.LeftCtrl, Key.RightCtrl, Key.LeftShift, Key.RightShift }; 
    var actualKey = e.RealKey(); 

    if (e.IsDown && !nonShortcuttableKeys.Contains(actualKey)) 
    { 
     var tb = sender as TextBox; 

     var modifiers = new List<ModifierKeys>(); 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
     { 
      modifiers.Add(ModifierKeys.Control); 
     } 

     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Alt)) 
     { 
      modifiers.Add(ModifierKeys.Alt); 
     } 

     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
     { 
      modifiers.Add(ModifierKeys.Shift); 
     } 

     tb.Text = modifiers.Count == 0 
      ? string.Format("{0}", actualKey) 
      : string.Format("{0} + {1}", string.Join(" + ", modifiers), actualKey); 

     Hotkey = actualKey; 
    } 

    e.Handled = true; 
} 
+0

ありがとうございます!それは正常に動作しています。私は私のニーズに合わせて少し修正しました。このように 'Keyboard'から修飾子キーにアクセスできることは決してありません; D – Reynevan

0

WinForms Ctrlキーを押したときにKeyEventArgs.Modifiersを確認できます。 https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.modifiers(v=vs.110).aspx

WPF

Controlキーが押されたかどうかをチェックするために、この小さなスニペットを使用することができます

:あなたがのキーバインドを使用することができますMVVMパターンを使用したい場合は

Keyboard.IsKeyDown(Key.LeftCtrl) 

テキストボックス(またはその他のコントロール) Create Key binding in WPF

+0

oops winforms答え;-)私はWPF – Mat

+0

にもお答えするように編集しました。お返事ありがとうございます。私はそれを使用しようとしましたが、それは私のために動作していないようです。私は何か間違っているのですか?私はオリジナルのポストを更新しました、あなたはそれを見てみることができますか? – Reynevan

関連する問題