Gewusst wie: Behandeln von Tastatureingaben auf Formularebene
Windows Forms bietet die Möglichkeit, Tastaturmeldungen auf Formularebene zu behandeln, bevor die Meldungen ein Steuerelement erreichen. In diesem Thema wird beschrieben, wie diese Aufgabe bewerkstelligt wird.
So behandeln Sie eine Tastaturmeldung auf Formularebene
Behandeln Sie das KeyPress-Ereignis oder das KeyDown-Ereignis des Startformulars, und legen Sie die KeyPreview-Eigenschaft des Formulars auf true fest, sodass die Tastaturmeldungen vom Formular empfangen werden, bevor sie die Steuerelemente auf dem Formular erreichen. Im folgenden Codebeispiel wird das KeyPress-Ereignis behandelt, indem alle Zahlentasten erkannt und '1', '4' und '7' verwendet werden.
' Detect all numeric characters at the form level and consume 1, ' 4, and 7. Note that Form.KeyPreview must be set to true for this ' event handler to be called. Sub Form1_KeyPress(ByVal sender As Object, _ ByVal e As KeyPressEventArgs) Handles Me.KeyPress If e.KeyChar >= ChrW(48) And e.KeyChar <= ChrW(57) Then MessageBox.Show(("Form.KeyPress: '" + _ e.KeyChar.ToString() + "' pressed.")) Select Case e.KeyChar Case ChrW(49), ChrW(52), ChrW(55) MessageBox.Show(("Form.KeyPress: '" + _ e.KeyChar.ToString() + "' consumed.")) e.Handled = True End Select End If End Sub
// Detect all numeric characters at the form level and consume 1, // 4, and 7. Note that Form.KeyPreview must be set to true for this // event handler to be called. void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar >= 48 && e.KeyChar <= 57) { MessageBox.Show("Form.KeyPress: '" + e.KeyChar.ToString() + "' pressed."); switch (e.KeyChar) { case (char)49: case (char)52: case (char)55: MessageBox.Show("Form.KeyPress: '" + e.KeyChar.ToString() + "' consumed."); e.Handled = true; break; } } }
// Detect all numeric characters at the form level and consume 1, // 4, and 7. Note that Form.KeyPreview must be set to true for this // event handler to be called. private: void Form1_KeyPress(Object^ sender, KeyPressEventArgs^ e) { if ((e->KeyChar >= '0') && (e->KeyChar <= '9')) { MessageBox::Show("Form.KeyPress: '" + e->KeyChar.ToString() + "' pressed."); switch (e->KeyChar) { case '1': case '4': case '7': MessageBox::Show("Form.KeyPress: '" + e->KeyChar.ToString() + "' consumed."); e->Handled = true; break; } } }
Beispiel
Das folgende Codebeispiel entspricht der gesamten Anwendung für das oben erwähnte Beispiel. Die Anwendung umfasst eine TextBox sowie zahlreiche andere Steuerelemente, mit denen Sie den Fokus von der TextBox verschieben können. Das KeyPress-Ereignis des primären Form verwendet '1', '4' und '7', und das KeyPress-Ereignis der TextBox verwendet '2', '5' und '8' und zeigt die übrigen Tasten an. Vergleichen Sie die MessageBox-Ausgabe, wenn Sie eine Zahlentaste drücken, während die TextBox den Fokus besitzt, mit der MessageBox-Ausgabe, wenn Sie eine Zahlentaste drücken, während eines der anderen Steuerelemente über den Fokus verfügt.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Namespace KeyboardInputForm
Class Form1
Inherits Form
Private WithEvents TextBox1 As New TextBox()
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Public Sub New()
Me.AutoSize = True
Dim panel As New FlowLayoutPanel()
panel.AutoSize = True
panel.FlowDirection = FlowDirection.TopDown
panel.Controls.Add(TextBox1)
Me.Controls.Add(panel)
Me.KeyPreview = True
End Sub
' Detect all numeric characters at the form level and consume 1,
' 4, and 7. Note that Form.KeyPreview must be set to true for this
' event handler to be called.
Sub Form1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar >= ChrW(48) And e.KeyChar <= ChrW(57) Then
MessageBox.Show(("Form.KeyPress: '" + _
e.KeyChar.ToString() + "' pressed."))
Select Case e.KeyChar
Case ChrW(49), ChrW(52), ChrW(55)
MessageBox.Show(("Form.KeyPress: '" + _
e.KeyChar.ToString() + "' consumed."))
e.Handled = True
End Select
End If
End Sub
' Detect all numeric characters at the TextBox level and consume
' 2, 5, and 8.
Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress
If e.KeyChar >= ChrW(48) And e.KeyChar <= ChrW(57) Then
MessageBox.Show(("Control.KeyPress: '" + _
e.KeyChar.ToString() + "' pressed."))
Select Case e.KeyChar
Case ChrW(50), ChrW(53), ChrW(56)
MessageBox.Show(("Control.KeyPress: '" + _
e.KeyChar.ToString() + "' consumed."))
e.Handled = True
End Select
End If
End Sub
End Class
End Namespace
using System;
using System.Drawing;
using System.Windows.Forms;
namespace KeyboardInputForm
{
class Form1 : Form
{
TextBox TextBox1 = new TextBox();
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
{
this.AutoSize = true;
FlowLayoutPanel panel = new FlowLayoutPanel();
panel.AutoSize = true;
panel.FlowDirection = FlowDirection.TopDown;
panel.Controls.Add(TextBox1);
this.Controls.Add(panel);
this.KeyPreview = true;
this.KeyPress +=
new KeyPressEventHandler(Form1_KeyPress);
TextBox1.KeyPress +=
new KeyPressEventHandler(TextBox1_KeyPress);
}
// Detect all numeric characters at the form level and consume 1,
// 4, and 7. Note that Form.KeyPreview must be set to true for this
// event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar >= 48 && e.KeyChar <= 57)
{
MessageBox.Show("Form.KeyPress: '" +
e.KeyChar.ToString() + "' pressed.");
switch (e.KeyChar)
{
case (char)49:
case (char)52:
case (char)55:
MessageBox.Show("Form.KeyPress: '" +
e.KeyChar.ToString() + "' consumed.");
e.Handled = true;
break;
}
}
}
// Detect all numeric characters at the TextBox level and consume
// 2, 5, and 8.
void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar >= 48 && e.KeyChar <= 57)
{
MessageBox.Show("Control.KeyPress: '" +
e.KeyChar.ToString() + "' pressed.");
switch (e.KeyChar)
{
case (char)50:
case (char)53:
case (char)56:
MessageBox.Show("Control.KeyPress: '" +
e.KeyChar.ToString() + "' consumed.");
e.Handled = true;
break;
}
}
}
}
}
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::Security::Permissions;
namespace KeyboardInputForm
{
public ref class Form1 sealed: public Form, public IMessageFilter
{
// The following Windows message value is defined in Winuser.h.
private:
static const int WM_KEYDOWN = 0x100;
private:
TextBox^ inputTextBox;
public:
Form1()
{
inputTextBox = gcnew TextBox();
this->AutoSize = true;
Application::AddMessageFilter(this);
FlowLayoutPanel^ panel = gcnew FlowLayoutPanel();
panel->AutoSize = true;
panel->FlowDirection = FlowDirection::TopDown;
panel->Controls->Add(gcnew Button());
panel->Controls->Add(gcnew RadioButton());
panel->Controls->Add(inputTextBox);
this->Controls->Add(panel);
this->KeyPreview = true;
this->KeyPress +=
gcnew KeyPressEventHandler(this, &Form1::Form1_KeyPress);
inputTextBox->KeyPress +=
gcnew KeyPressEventHandler(this,
&Form1::inputTextBox_KeyPress);
}
// Detect all numeric characters at the
// application level and consume 0.
[SecurityPermission(SecurityAction::LinkDemand,
Flags=SecurityPermissionFlag::UnmanagedCode)]
virtual bool PreFilterMessage(Message% m)
{
// Detect key down messages.
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)((int)m.WParam) & Keys::KeyCode;
// Determine whether the keystroke is a number from the top of
// the keyboard, or a number from the keypad.
if (((keyCode >= Keys::D0) && (keyCode <= Keys::D9))
||((keyCode >= Keys::NumPad0)
&& (keyCode <= Keys::NumPad9)))
{
MessageBox::Show(
"IMessageFilter.PreFilterMessage: '" +
keyCode.ToString() + "' pressed.");
if ((keyCode == Keys::D0) || (keyCode == Keys::NumPad0))
{
MessageBox::Show(
"IMessageFilter.PreFilterMessage: '" +
keyCode.ToString() + "' consumed.");
return true;
}
}
}
// Forward all other messages.
return false;
}
// Detect all numeric characters at the form level and consume 1,
// 4, and 7. Note that Form.KeyPreview must be set to true for this
// event handler to be called.
private:
void Form1_KeyPress(Object^ sender, KeyPressEventArgs^ e)
{
if ((e->KeyChar >= '0') && (e->KeyChar <= '9'))
{
MessageBox::Show("Form.KeyPress: '" +
e->KeyChar.ToString() + "' pressed.");
switch (e->KeyChar)
{
case '1':
case '4':
case '7':
MessageBox::Show("Form.KeyPress: '" +
e->KeyChar.ToString() + "' consumed.");
e->Handled = true;
break;
}
}
}
// Detect all numeric characters at the TextBox level and consume
// 2, 5, and 8.
private:
void inputTextBox_KeyPress(Object^ sender, KeyPressEventArgs^ e)
{
if ((e->KeyChar >= '0') && (e->KeyChar <= '9'))
{
MessageBox::Show("Control.KeyPress: '" +
e->KeyChar.ToString() + "' pressed.");
switch (e->KeyChar)
{
case '2':
case '5':
case '8':
MessageBox::Show("Control.KeyPress: '" +
e->KeyChar.ToString() + "' consumed.");
e->Handled = true;
break;
}
}
}
};
}
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew KeyboardInputForm::Form1());
}
Kompilieren des Codes
Für dieses Beispiel ist Folgendes erforderlich:
- Verweise auf die Assemblys System, System.Drawing und System.Windows.Forms.
Informationen zum Erstellen dieses Beispiels über die Befehlszeile für Visual Basic oder Visual C# finden Sie unter Erstellen von der Befehlszeile aus (Visual Basic) oder unter Erstellen über die Befehlszeile mit csc.exe. Sie können dieses Beispiel auch in Visual Studio erstellen, indem Sie den Code in ein neues Projekt einfügen. Weitere Informationen finden Sie unter Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio.