3

WindowsフォームのKeyPreviewプロパティを認識しています。これにより、フォームは、フォーカスされたコントロールに渡される前にキーイベントを受け取ることができます。

ただし、フォーカスされたコントロールに到達した後、フォームがイベントを受信するようにします。

テストとして、フォームにTextBoxを配置しました。TextBoxに入力すると、特定のキーコマンドを押すと、デフォルトの動作を実行する必要があります。Ctrl-S、F1など、テキストボックスからフォームまでバブルして、より高いレベルで処理できるようにします。これらのコマンドは、TextBoxがデフォルトで実行しないコマンドです。

ただし、最初にTextBoxを通過するイベントが必要です。この機能が必要なアプリケーションは、この単純な例よりも複雑です。たとえば、TextBoxがフォーカスされたコントロールである場合、Ctrl-CとCtrl-Vを使用してデフォルトのコピーアンドペーストを実行する必要があります。ただし、他のさまざまなコントロールに焦点を当てている場合、これらのコマンドは、そこで処理される最上位のフォームレベルに到達する必要があります。

編集: 入力イベントはフォームからフォーカスされたコントロールに移動し、私が期待していたようにその逆ではないようです。フォーカスからフォームに移行した場合、おそらく問題は発生しません。

Edit2: この記事を(簡単に)読んだ:http://www.codeproject.com/KB/WPF/BeginWPF3.aspx私は今、私がちょうど「そこにいる」と期待していた種類の「バブリング」があると仮定していますWPFでのみ使用可能で、標準のC#では使用できません。醜いコードを書くのではなく、ユーザーが私のアプリを操作する方法を再考する必要があると思います。

醜いコードなしでC#でWPFスタイルのバブリングを行うことに返信できる人には大きなポイントがあります。

4

4 に答える 4

2

KeyPreviewプロパティを引き続き使用できますが、フォーカスされているコントロールを確認します。テキストボックスの場合は何もしません。それ以外の場合は、別のコントロール(RichTextBoxなど)の場合は、押されたキーを処理します。現在フォーカスされているコントロールを取得するには、Win32APIにアクセスする必要がある場合があります。例:新しいWindowsフォームアプリケーションを作成し、フォームにテキストボックスとリッチテキストボックスを追加し、フォームのKeyPreviewプロパティをtrueに設定し、フォームのKeyDownイベント、テキストボックス、およびリッチテキストボックスのイベントハンドラーを追加します。また、次の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");
    }
}
于 2010-02-18T01:45:28.433 に答える
0

以下のリンクを確認してください。

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

お役に立てれば。

よろしく、ラジャ

于 2010-02-17T15:24:20.043 に答える
0

残念ながら、手動で実装する必要があります。フォームにKeyDownイベントハンドラーを実装し、グローバルキーの組み合わせを確認して、KeyPressEventArgs.Handled=trueを設定します。

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

于 2010-02-17T15:26:30.197 に答える
-1

テキストボックスのKeyPressおよび/またはKeyUp/KeyDownイベントのイベントハンドラーを実装できます。

KeyPressイベントのイベントハンドラーでHandled、イベント引数のプロパティをに設定するtrueと、イベントはテキストボックスに渡されません。に設定しないとtrue、になります。

(2番目の段落を明確にするために編集)。

于 2010-02-17T15:27:58.587 に答える