2012-04-27 2 views
4

수정 된 키 (CNTRL 또는 SHIFT)를 눌렀거나 놓았을 때를 알리고 싶습니다. 기본적으로 사용자는 수정 자 키를 누른 상태에서 여러 번의 키 입력을 수행 할 수 있으며, 릴리스 된 후 (CNTRL + X + S를 사용하여 emacs를 생각할 때까지) 작업을 수행하고 싶지 않습니다. PreviewKeyUp 및 PreviewKeyDown 함께 할려고했지만 정상 키 및 수정자를 처리하는 것 같다. 이벤트에서 수정 자 키를 눌렀는지 여부를 알 수 있지만 수정 자 키가 해제되고 이벤트간에 다시 누를 지 여부는 알 수 없습니다.변경자 키를 눌렀다가 놓았을 때 알리는 방법

답변

1

기존에 Key.LeftShift 등이 있음을 깨달았습니다. 그래서 키를 눌렀을 때 플래그를 설정하고 키를 놓을 때 플래그를 확인할 수 있습니다.

2
protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    //just picked that key for a sample 
     case Key.Tab: 
      if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) 
      DoMyStuff(); 

     ///similar things for Ctrl 
     if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) 
      ..... 
0

가장 쉬운 방법은 수정자를 얻고 싶을 때입니다.

var kb = new Microsoft.VisualBasic.Devices.Keyboard(); 

var alt = kb.AltKeyDown; 
var ctrl = kb.CtrlKeyDown; 
var shift = kb.ShiftKeyDown; 

당신은 그것의 방법을 만들 수 있으므로이 같은 작업을 쉽게 할 것이다 :

using Microsoft.VisualBasic.Devices; 

... 

private static readonly Keyboard KEYBOARD = new Keyboard(); 

private static Keys GetPressedModifiers() 
{ 
    var mods = Keys.None; 

    if (KEYBOARD.AltKeyDown) 
    { 
     mods |= Keys.Alt; 
    } 

    if (KEYBOARD.CtrlKeyDown) 
    { 
     mods |= Keys.Control; 
    } 

    if (KEYBOARD.ShiftKeyDown) 
    { 
     mods |= Keys.Shift; 
    } 

    return mods; 
} 
0

당신은에서 KeyDown 또는 PreviewKeydown 이벤트에서이 같은 일을 할 수 있습니다.

난 그냥 시프트의 예 + A
경우 (e.Key == Key.A & & Keyboard.Modifiers == ModifierKeys.Shift)를 복용하고 // 여기
{
       // 뭔가해라.
}