2009-04-29 5 views
2

응용 프로그램 시작 중에 수정 자 키를 눌렀는지 여부를 캡처하여 전체 화면 또는 창으로 결정했습니다.응용 프로그램 시작시 키보드 수정 자

주 창 생성자에서 Keyboard.Modifiers 열거 형을 확인해보고 Shift 키가 눌러져 있는지 확인했습니다. 항상 '없음'을 표시했습니다.

그래서 나는 DispatcherTimer을 시작하고 Tick 이벤트에서 시프트를 확인하여 다른 접근 방식을 시도했습니다. 그게 잘 작동하는 것 같습니다.

질문은 이것이 최선의 (유일한) 방법입니까? 왜 수식어는 창 생성자에서 올바른 값을 반환하지 않습니까?

답변

1

Keyboard.Modifiers은 사용할 올바른 클래스/속성입니다.

FrameworkElement.Loaded 이벤트에 대한 처리기의 수정자를 확인하는 것이 좋습니다.

this.Loaded += new RoutedEventHandler(Window_Loaded); 

그리고 : 다음 Window 생성자 InitializeComponent() 이후에

void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // Examine Keyboard.Modifiers and set fullscreen/windowed 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0) 
    { 
     //SetFullscreen(); 
    } 
} 
+0

네 - 타이머 방법보다 더 나은. 하지만 수식어가 컨스트럭터에서 작동하지 않는 이유는 무엇입니까? – PaulB

+0

확실하지 않습니다. 앱이 방금 시작된 이후로 키보드 클래스/기기가 초기화되지 않아야합니다. –

+0

나중에 생성 된 컨트롤의 생성자에서 Keyboard.Modifiers를 사용할 수 있다고 생각합니다. 앱이 방금 시작된 이래로 기본 창이 아닙니다. –

0

나는 아마 당신의 메시지 루프 때까지 작동하지 않습니다 커버, 아래 GetKeyState을 사용 Keyboard.Modifiers 내기 파견했다 그 첫 번째 메시지. GetAsyncKeyState 당신을 위해 일할 것입니다 (P/Invoke를 통해, 제가 모르는 전화를하지 않는 한 .net).

을에서 :

0

summary ... 두 번째 링크는 그냥 (두 번째 링크에서 프로젝트에이 질문에 대한 대답에서) 조쉬 G의 코드를 추가합니다 ... 그 과정에서 그것을 보여 큰 코드가 InitializeComponent를() 후 윈도우 생성자 :

this.Loaded += new RoutedEventHandler(Window_Loaded); 

그리고 :

void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // Examine Keyboard.Modifiers and set fullscreen/windowed 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0) 
    { 
     MessageBox.Show("The Window is Shifty..."); 
    } 
} 
관련 문제