WPF에서 수정 자 키 상태를 감지하는 방법은 무엇입니까?


151

Control, Shift, Alt 버튼이 눌 렸는지 여부에 액세스해야 할 때마다 사용할 수있는 전역 구성이 있습니까? 예를 들어 내부 MouseDown이벤트 TreeView.

그렇다면 어떻게?

답변:


257

class를 사용하십시오 Keyboard. 사용 Keyboard.IsKeyDown제어, 시프트 경우 확인할 수 있습니다 Alt 키 지금 다운.

Shift의 경우 :

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }

통제를 위해 :

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }

Alt의 경우 :

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }

125

또한있다 :

// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{

}

13
훨씬 더 나은 솔루션. 또한 모든 수정자를 한 번에 확인할 수 있습니다. Ctrl + F를 처리하려면 Ctrl + Shift + F를 처리하고 싶지 않으므로 (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)다른 모든 항목 대신 확인할 수 있습니다 .
ygoe

35
위의 예에서 비교하면 다른 결과가 나타납니다! ModifierKeys 열거 형에 Flags 특성이 있으므로 열거 형에 값을 조합하여 사용할 수 있습니다. Shift 키만 누르고 있으면 Keyboard.Modifiers == ModifierKeys.Shift명령문을 사용하십시오 . Shift 키를 잡고 싶지만 동시에 다른 수정자를 눌렀는지 신경 쓰지 않으려면 (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.ShiftHasFlag 구문을 사용하십시오.Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)
Patrik B

4
이 방법으로 Windows 키 수정자를 잡을 수 없었습니다. (CTRL은 잘 작동했습니다.) 나는 잡으려고 노력했다 WIN+RightArrow.
ANeves

1
@ANeves 흥미롭고, 다음 Keyboard.Modifiers과 같이 표시됨None

8
    private bool IsShiftKey { get; set; }

    private void OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;

        if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
        {
           e.Handled = true;
        }
    }

2
해설과 코드가 있으면 답이 더 좋습니다. 상황을 알려주십시오.
Chris

1
그것을 재산으로 추가하는 좋은 아이디어
RollRoll

1
Alt + 다른 키를 찾기 위해 PreviewKeyDown을 사용할 때 e.Key 대신 e.SystemKey를 사용해야했습니다 (e.Key의 값은 alt + another 문자를 사용하는 경우 "System"이었습니다)
Josh

3

이것이 내가 처리하는 방법입니다 (PreviewKeyDown 사용). Alt + R을 찾고 있다고 가정 해 봅시다.

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
       && e.SystemKey == Key.R)
    {
       //do whatever
    }
}

어쩌면 누군가 수정 자 때문에 e.Key가 아닌 e.SystemKey를 사용해야하는 이유를 알 수 있습니까? 그러나 이것은 modifier + key를 검색 할 때 완벽하게 작동했습니다.


0

또한 :

My.Computer.Keyboard.ShiftKeyDown이면 ...

내 컴퓨터, 키보드, CtrlKeyDown

내 컴퓨터, 키보드, AltKeyDown


0

@Josh에서 부분 차용하고 @Krushik과 다소 비슷하며 KeyEventArgs.systemKey와 KeyEventArgs.Key차이점 에 대한 질문을 참조 합니다 (Josh가 왜 SystemKey를 사용해야하는지에 대한 대답). 여기서 수정 자 키 (예 : Alt)를 사용하는 경우 e.Key는 Key.System을 반환하므로 '실제'키는 e.SystemKey 내에 있습니다.

이를 해결하는 방법은 먼저 '실제'키를 가져온 다음 조건부를 수행하는 것입니다.

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    // Fetch the real key.
    var key = e.Key == Key.System ? e.SystemKey : e.Key;

    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
        && key == Key.Return)
    {
        // Execute your code.
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.