WPF Q&A

ALT 키를 이용한 키조합 기능 구현하는데 궁금한 부분이 있습니다.. 비가와요 평점: 없음 조회: 333
먼저 구현 하려는 기능은

- ALT + 숫자키를 누르면 미리 지정된 기능이 실행된다. (0.5초 이내에 ALT 를 누르고 숫자를 누름)
- ALT 키만 0.5 초 이상 누르고 있으면 ALT 키와 함게 사용되는 등록된 단축 기능표(Grid)를 화면에 보여준다.
  이 경우 등록된 또 다른 키를 누르면 등록된 기능을 수행하고
  ALT 키를 떼면 화면에 보여준 표(Grid)를 닫는다.

이렇게 하려 합니다.
일단 Window의 Window_PreviewKeyDown(), Window_PreviewKeyUp() 이벤트를 활용해 보려 했는데,
ALT 키가 Left Alt 와 System 이렇게 두종류로 발생됩니다.

이것은 윈도우에서 Alt 키를 다른 용도로 이미 사용하고 있어서 그런것 같은데..
방법이 없을까요?

확인은 이렇게 해봤습니다.
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            string keystatus = "e.Key=" + e.Key + ", IsToggled =" + e.IsToggled + ", IsDown=" + e.IsDown + ", IsUp=" + e.IsUp + ", IsRepeat=" + e.IsRepeat + ", KeyStates=" + e.KeyStates;
 
            if (e.Key == Key.LeftAlt || e.Key == Key.RightAlt || e.Key == Key.System)
            {                
                if (Keyboard.IsKeyDown(Key.D1) || Keyboard.IsKeyDown(Key.NumPad1))
                    keystatus += ", Number = 1";
                else if (Keyboard.IsKeyDown(Key.D2) || Keyboard.IsKeyDown(Key.NumPad2))
                    keystatus += ", Number = 2";
                else if (Keyboard.IsKeyDown(Key.D3) || Keyboard.IsKeyDown(Key.NumPad3))
                    keystatus += ", Number = 3";
                else if (Keyboard.IsKeyDown(Key.D4) || Keyboard.IsKeyDown(Key.NumPad4))
                    keystatus += ", Number = 4";
                else if (Keyboard.IsKeyDown(Key.D5) || Keyboard.IsKeyDown(Key.NumPad5))
                    keystatus += ", Number = 5";
                else if (Keyboard.IsKeyDown(Key.D6) || Keyboard.IsKeyDown(Key.NumPad6))
                    keystatus += ", Number = 6";
                else if (Keyboard.IsKeyDown(Key.D7) || Keyboard.IsKeyDown(Key.NumPad7))
                    keystatus += ", Number = 7";
                else if (Keyboard.IsKeyDown(Key.D8) || Keyboard.IsKeyDown(Key.NumPad8))
                    keystatus += ", Number = 8";
                else if (Keyboard.IsKeyDown(Key.D9) || Keyboard.IsKeyDown(Key.NumPad9))
                    keystatus += ", Number = 9";
                else if (Keyboard.IsKeyDown(Key.D0) || Keyboard.IsKeyDown(Key.NumPad0))
                    keystatus += ", Number = 0";
                else
                    keystatus += ", Number = ??";
            }                        
            Console.WriteLine("PreKeyDown : " + keystatus);
        }

태그 : PreviewKeyDown WPF
작성자 정보
비가와요
Level 29
 [EXP.11/50]

메일:  비공개
글등록 +12 600 덧글등록 +3 111
자기소개
WPF 초보입니다~
글 공유하기 |
  tweet facebook
2018-11-13 오후 6:00:38
나도한마디
사용자
피카스            [2019-05-15]
Level 16
 [EXP.61/70]
CommandBinding 과 PreviewKeyDown, PreviewKeyUp 이벤트로 만들어봤습니다.

1.Xaml편

<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3"
Title="MainWindow" Height="350" Width="525"
PreviewKeyDown="Window_PreviewKeyDown" PreviewKeyUp="Window_PreviewKeyUp">
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MainWindow.MyRoutedCommand1}"
CanExecute="MyRoutedCommand1_CanExecute"
Executed="MyRoutedCommand1_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Key="D1" Modifiers="Alt" Command="{x:Static local:MainWindow.MyRoutedCommand1}" />
</Window.InputBindings>
<Grid Margin="20" x:Name="gd" Visibility="Collapsed">
<StackPanel>
<TextBlock Text="Alt + 1" />
<TextBlock Text="Alt + 2" />
<TextBlock Text="Alt + 3" />
<TextBlock Text="Alt + 4" />
<TextBlock Text="Alt + 5" />
<TextBlock Text="Alt + 6" />
</StackPanel>
</Grid>
</Window>
사용자
피카스            [2019-05-15]
Level 16
 [EXP.61/70]
2. 비하인드 코드편
public partial class MainWindow : Window
{
#region RoutedCommand
public static RoutedCommand MyAltRoutedCommand = new RoutedCommand();
public static RoutedCommand MyRoutedCommand1 = new RoutedCommand();
#endregion

public MainWindow()
{
InitializeComponent();
}

private void MyRoutedCommand1_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}

private void MyRoutedCommand1_Executed(object sender, ExecutedRoutedEventArgs e)
{
gd.Visibility = System.Windows.Visibility.Collapsed;

MessageBox.Show("1번 동작");
}

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.System))
{
gd.Visibility = System.Windows.Visibility.Visible;
}
}

private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.System))
{
gd.Visibility = System.Windows.Visibility.Collapsed;
}
}
}
태그로 엮인글
[WPF Q&A] [wpf c#] 이미지 확대 축소시 확대율 가져오기...  아스피린
[구인&교육정보] [ 수원 / 안산 ] .NET 제조업무 시스템 [ 운영 / 초급 ]  한국정보데이터시스
[구인&교육정보] [ 기흥 ] C# 생산관리 시스템 [ 개발 / 중급 ]  한국정보데이터시스
[WPF Q&A] wpf layout 맞추는게 윈폼과 달라 개념조차 이해가 잘 안 가네요.. [2]+1  환이아빠
[구인&교육정보] [채울] c# WPF UI 개발  가우스
[C#.NET Q&A] c# WPF 사이즈 조절 이벤트 관련 질문입니다.[1]  오마르
[C#.NET Q&A] wpf에서 g.cs 파일이 뭔가요?[1]  Tube
[C#.NET Q&A] wpf 공부 방법??  Tube
[WPF Q&A] 동시에 두화면에 NotifyPropertyChanged 시키려면 어떻게 해야하나요..?[2]  Neall
[WPF Q&A] WPF 메세지박스 띄웠다가 자동으로 꺼지는방법..[2]  bb
글리스트
wpf layout 맞추는게 윈폼과 달라 개념조차 이해가 잘 안 가네요.. [2]+1  환이아빠
GIF 이미지 멈춤현상[5]+4  news0516
자동완성 구문에서 쌍따옴표 빠져 나가기[1]  초보자
전체 화면에서 데이터 하나를 변경했을 때 전부다 변경되도록 하는 방법[1]  Neall
동시에 두화면에 NotifyPropertyChanged 시키려면 어떻게 해야하나요..?[2]  Neall
WPF 메세지박스 띄웠다가 자동으로 꺼지는방법..[2]  bb
사용자 정의 콘트롤의 속성 Binding 이 잘 안됩니다... (DependencyProperty)[3]  비가와요
WPF Trigger를 통한 자식객체 제어[1]  렐릭
C#으로 외부 프로그램을 설치 및 설치가 끝나면 알 수 있는 방법이 있을까요?[1]  Neall
ToolTip 에서 다른 TextBlock 의 Text 바인딩을 하려면 어떻게 하면 될까요?[2]+1  비가와요
 ★현재글->   ALT 키를 이용한 키조합 기능 구현하는데 궁금한 부분이 있습니다..[2]  비가와요
imagesource 기반으로 image 다시 그려내려면 어떻게 해야하나요?  코쟁이놈
Attached property가 view 와 model의 종속성을 감소시키는데 기여하는게 맞는것인지요?[2]+5  코쟁이놈
다른 페이지에서 변경한 클래스값의 바인딩[2]+2  towamk
WPF 에서 PrintDialog.PrintVisual 실행시 Label에 Name 속성을 지정 하면 출력이 안됩...  워너비포티
WPF에서의 그래픽처리 질문입니다 [1]+1  렐릭
Send 버튼 눌렀을 시 TextBlock 반영 방법[1]  WPFWTF
Rectangle에 Fill 된 색 값을 알아 내는 방법은 없나요??[1]+1  존오비미켈
Grid 에 Border 를 이용해 표를 만들었는데 세로줄이 상황에 따라 어긋나는 현상.[2]+2  비가와요
WPF 코드바인딩 관련 질문 하나 드립니다. (내용이 안보여 재업로드)[1]+2  죵김
WPF 코드바인딩 관련 질문 하나 드립니다.  죵김