0

現在アクティブなコントロールがまだ処理していない場合に限り、エラー音を出さずにWinフォームでEnterを処理する必要があります(他のキーの中でも)。

したがって、TextBoxまたはDateTimePickerでEnterキーを押すと、フォームで(エラー音なしで)処理したいのですが、たとえばDataGridViewで押すと、デフォルトでDataGridViewと同じように処理されます。 。

OnKeyUpは、未処理のキーストローク(e.Handled)のみを処理するという私の問題を解決し、ProcessCmdKey(this)はサウンドの問題を解決しますが、どちらも両方を解決しません。

助言がありますか?

4

1 に答える 1

0

非常に興味深い質問に対する称賛。残念ながら、この記事のメインフォームでProcessCmdKeyをオーバーライドする以外に、すべてのキーを押すためのグローバルイベントハンドラーを見つけることができないようです。このメソッドの唯一の問題は、イベントハンドラーデリゲートに渡される引数が、イベントを作成しているコントロールを定義しないことです:(

したがって、私の唯一の考えは、アプリケーション内のすべてのコントロールにイベントハンドラーを割り当てる必要があるということです。これを行う方法を示すのに役立つコードをいくつか作成しました。KeyPressイベントハンドラーをページ上のすべてのコントロールに割り当てることの悪影響が何であるかはわかりませんが、それが私が見る唯一の実行可能な解決策です。

コード:

private void Form1_Load(object sender, EventArgs e)
{
    AssignHandler(this);
}

protected void HandleKeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter && (sender != this.textBoxToIgnore || sender ! this.gridViewToIgnore))
    {
        PlaySound();  // your error sound function
        e.Handled = true;
    }
}

public void AssignHandler(Control c)
{
    c.KeyPress += new KeyPressEventHandler(HandleKeyPress);
    foreach (Control child in c.Controls)
    {
        AssignHandler(child);
    }
}
于 2010-10-01T23:49:48.550 に答える