2010-02-17 3 views
2

저는 Windows Form의 KeyPreview 속성을 알고 있으므로 양식에서 포커스가있는 컨트롤로 전달되기 전에 키 이벤트를받을 수 있습니다.컨트롤에서 폼에 키 이벤트를 버블 링하는 방법은 무엇입니까?

그러나 집중된 컨트롤에 도달 한 후 Form이 이벤트를 수신하도록합니다.

테스트에서는 Form에 TextBox를 배치했습니다. TextBox에서 타이핑 할 때 특정 키 명령을 누르면 기본 동작을 수행해야합니다. Ctrl-S, F1, 등등, TextBox를 통해 상위 수준에서 처리 할 수있는 양식으로 버블 링해야합니다. 이 명령은 TextBox가 기본적으로 수행하지 않는 명령입니다.

먼저 TextBox를 통과하는 이벤트가 필요합니다. 이 기능이 필요한 응용 프로그램은이 간단한 예제보다 복잡합니다. 예를 들어 TextBox가 포커스가있는 컨트롤이면 Ctrl-C 및 Ctrl-V를 사용하여 기본 복사 & 붙여 넣기를 수행해야합니다. 그러나 여러 다른 컨트롤에 중점을 두었을 때 이러한 명령은 처리 할 최상위 Form-Level에서 끝나야합니다.

편집 : 입력 이벤트가 Form에서 Focused Control으로 이동하고 예상했던 것처럼 다른 방향으로 이동하지 않는 것 같습니다. Focus에서 Form으로 넘어 간다면 나는 문제가 없을 것입니다.

Edit2가 : 읽고 데 (짧게)이 문서에 불구하고 : http://www.codeproject.com/KB/WPF/BeginWPF3.aspx 지금은 그냥 '가'기대 한 '버블'의 종류는 WPF에서 사용할 수, 그리고 표준 C#이라고 가정하고 . 추악한 코드 조각을 쓰는 것과는 반대로 사용자가 내 앱과 상호 작용하는 방식을 다시 생각해야한다고 생각합니다.

추한 코드가없는 C#에서 WPF 스타일의 버블 링을 할 때 회신 할 수있는 모든 사람에게 큰 의미가 있습니다.

답변

2

여전히 KeyPreview 속성을 사용할 수 있지만 포커스가있는 컨트롤을 확인하십시오. 텍스트 상자이면 아무 것도하지 않습니다. 다른 컨트롤 인 경우 - RichTextBox - 누른 다음 누른 키를 처리하십시오. 현재 포커스가있는 컨트롤을 얻으려면 Win32 API에 액세스해야 할 수 있습니다. 예제 : 새 Windows Forms 응용 프로그램을 만들고 양식에 텍스트 상자와 richtext 상자를 추가하고 양식의 KeyPreview 속성을 true로 설정하고 양식의 KeyDown 이벤트에 대한 이벤트 처리기, 텍스트 상자 및 richtextbox를 추가하십시오 . 또한 다음 using 문 :

using System.Runtime.InteropServices;//for DllImport 

은 다음 코드에 의해 양식의 코드를 대체 :

public partial class Form1 : Form 
{ 
    // Import GetFocus() from user32.dll 
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] 
    internal static extern IntPtr GetFocus(); 

    protected Control GetFocusControl() 
    { 
     Control focusControl = null; 
     IntPtr focusHandle = GetFocus(); 
     if (focusHandle != IntPtr.Zero) 
      // returns null if handle is not to a .NET control 
      focusControl = Control.FromHandle(focusHandle); 
     return focusControl; 
    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     Control focusedControl = GetFocusControl(); 
     if (focusedControl != null && !(focusedControl is TextBox) && e.Control && e.KeyCode == Keys.C)//not a textbox and Copy 
     { 
      MessageBox.Show("@Form"); 
      e.Handled = true; 
     } 
    } 

    private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if(e.Control && e.KeyCode == Keys.C) 
      MessageBox.Show("@Control"); 
    } 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Control && e.KeyCode == Keys.C) 
      MessageBox.Show("@Control"); 
    } 
} 
+0

지금까지 최고의 답변; 나는 이것을 조금 가지고 놀고 그것이 어떻게되는지 볼 것입니다. 건배. – Wex

+0

내 필요를 위해 일하고있는 것 같습니다. 참고 사항. Control.FromHandle (focusHandle)은 ToolStripComboBox 및 PropertyGrid의 필드에서 null을 반환하는 것으로 보입니다. 다른 것이있을 수 있습니다. 하지만 내 애플 리케이션에 큰 문제가 아니에요. – Wex

0

아래 링크를 확인하십시오. 이 도움이

http://www.vbdotnetforums.com/windows-forms/30257-solved-ctrl-s-combobox.html

희망. 양식의 KeyDown 이벤트 처리기를 구현, 글로벌 키 조합을 확인하고 그들을 위해 KeyPressEventArgs.Handled = true로 설정 -

감사합니다, 라자

+0

이이 KeyPreview 속성을 사용합니다; KeyPress 핸들러를 오버라이드해야하는 많은 컨트롤이 있으므로 오히려하지 않을 것입니다. – Wex

0

는 수동 불행하게도 그것을 구현해야합니다. 참고로

: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx

+0

KeyPreview 속성이 true가 아닌 경우 Form.KeyDown이 호출되지 않습니다. KeyPreview를 사용하면 Ctrl-C 및 Ctrl-V가 양식에 캡쳐되어 처리되고 절대로 TextBox로 변환되지 않습니다. [나중에 ...] 실제로; 그냥 시도하고 Handled를 true로 설정해도 TextBox에 도달하는 명령이 중지되지 않습니다. SuppressKeyPress는 문제를 해결하지 못합니다. – Wex

-1

당신은 텍스트 상자의 키 누름 및/또는의 keyup /에서 KeyDown 이벤트에 대한 이벤트 처리기를 구현할 수 있습니다.

KeyPress 이벤트의 이벤트 처리기에서 이벤트 args의 Handled 속성을 true으로 설정하면 이벤트가 텍스트 상자로 전달되지 않습니다. true으로 설정하지 않으면 설정됩니다.

(두 번째 단락을 명확하게하기 위해 편집 됨).

+0

괜찮습니다.하지만 이벤트가 계속 거품에 포착되지는 않습니다. – Wex

+0

당신이 무엇을 요구하는지 모르겠습니다. Windows Form 응용 프로그램을 만들고 양식에 텍스트 상자를 추가하고 Form에 TextBox의 KeyPress에 대한 이벤트 처리기를 추가했습니다. 그런 다음 양식은 TextBox의 KeyPress 이벤트를 처리하는 객체입니다. 일어날 수있는 "버블 링"이 없습니다. –

+0

음, 말하기 가장 간단한 것은 버블 링이 발생하기를 바랍니다. :/ – Wex