0

アプリで、または少なくとも特定のイベントハンドラーで、キーボードのビープ音を抑制したいと思います。これは可能ですか?

アップデート

さて、あなたはそれを求めました(コードサンプル):

プレビューキーダウン:

    private void textBoxDuckbill_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
        switch (e.KeyCode) {
            case Keys.Down:
            case Keys.Up:
                e.IsInputKey = true;
                break;
        }
    }

キーダウン:

    private void textBoxDuckbill_KeyDown(object sender, KeyEventArgs e) {
        TextBox tb = (TextBox)sender;

        if (e.KeyCode.Equals(Keys.Up)) {
            SetFocusOneRowUp(tb.Name);
            e.Handled = true;
            return;
        }
        if (e.KeyCode.Equals(Keys.Down)) {
            SetFocusOneRowDown(tb.Name);
            e.Handled = true;
            return;
        }

        if (e.KeyCode.Equals(Keys.Left)) {
            SetFocusOneColumnBack(tb.Name);
            e.Handled = true;
            return;
        }
        if (e.KeyCode.Equals(Keys.Right)) {
            SetFocusOneColumnForward(tb.Name);
            e.Handled = true;
            return;
        }
    }

キープレス:

    private void textBoxDuckbill_KeyPress(object sender, KeyPressEventArgs e) {
        TextBox tb = (TextBox)sender;
        errorProviderCRLogins.SetError(tb, String.Empty);

        // If user presses "%" (37) move back/left one TextBox column; 
        // if user presses "'"(39) move forward/right one TextBox column.
        // Also now allowing navigational arrows to do the same thing (KeyDown event)
        if (e.KeyChar == '%') {
            SetFocusOneColumnBack(tb.Name);
            e.Handled = true;
            return;
        }
        if (e.KeyChar == Convert.ToChar(@"'")) {
            SetFocusOneColumnForward(tb.Name);
            e.Handled = true;
            return;
        }

        // Preclude values (1,2,3) that would normally be allowed (see below) but do 
        // not have a value in the corresponding PlatypusID TextBox
        if (((e.KeyChar == '1') && (String.IsNullOrWhiteSpace(textBoxPlatypusNum1.Text))) ||
            ((e.KeyChar == '2') && (String.IsNullOrWhiteSpace(textBoxPlatypusNum2.Text))) ||
            ((e.KeyChar == '3') && (String.IsNullOrWhiteSpace(textBoxPlatypusNum3.Text)))) {
            e.Handled = true;
            return;
        }

        // Now, having gotten to here, we can assume that 1, 2, and 3 are valid (as are
        // Space and Backspace all the time).
        if ((e.KeyChar != '1') &&
            (e.KeyChar != '2') &&
            (e.KeyChar != '3') &&
            (e.KeyChar != (char)Keys.Space) &&
            (e.KeyChar != (char)Keys.Back)) {
            e.Handled = true;
            return;
        }

        // Added Space as an allowable entry so user can delete a val with that key
        // (which will automatically happen on tabbing into the TextBox, as it is
        // now being highlighted)
        if ((e.KeyChar == (char)Keys.Space) || (e.KeyChar == (char)Keys.Back)) {
            tb.Text = String.Empty;
            buttonSave.Enabled = true;
            // Don't return here, as they might continue to hit Space to zero out 
            // subsequent cells
        }

        // Now, if there is already a value in the cell (this is a repeated val, as shown
        // by TextLength being 1 instead of 0), move it to the next cell and give it the 
        // value just entered (even if space for "delete")
        if ((tb.TextLength == 1) || (e.KeyChar == (char)Keys.Space)) {
            buttonSave.Enabled = true;
            MoveToNextCellAndEnterVal(e.KeyChar.ToString(), tb.Name);
        }
        // Although KeyChar has a val such as 49/("1"), TextLength == 0
        if ((e.KeyChar == '1') ||
        (e.KeyChar == '2') ||
            (e.KeyChar == '3')) {
            buttonSave.Enabled = true;
        }
    }

テキストが変更されました:

    private void textBoxDuckbill_TextChanged(object sender, EventArgs e) {
        TextBox tb = (TextBox)sender;

        if (tb.Text == "1") {
            tb.BackColor = PlatypusID1_BACKCOLOR;
            tb.ForeColor = PlatypusID1_FORECOLOR;
            return;
        }

        if (tb.Text == "2") {
            tb.BackColor = PlatypusID2_BACKCOLOR;
            tb.ForeColor = PlatypusID2_FORECOLOR;
            return;
        }

        if (tb.Text == "3") {
            tb.BackColor = PlatypusID3_BACKCOLOR;
            tb.ForeColor = PlatypusID3_FORECOLOR;
            return;
        }

        tb.BackColor = System.Drawing.SystemColors.Window;
        tb.ForeColor = System.Drawing.SystemColors.WindowText;
    }

    private void MoveToNextCellAndEnterVal(string APlatypusID, string ATextBoxName) {
        String numericPortionOfTextBoxName = ATextBoxName.Remove(0, LENGTH_OF_TEXT_BOX_BASE);
        String sTextBoxToFind;
        int textBoxNumber = 0;
        int nextTextBoxNumber;

        int.TryParse(numericPortionOfTextBoxName, out textBoxNumber);
        nextTextBoxNumber = ++textBoxNumber;
        // "wrap around"
        if (nextTextBoxNumber > NUMBER_OF_QUARTER_HOURS) {
            nextTextBoxNumber = nextTextBoxNumber - NUMBER_OF_QUARTER_HOURS;
        }
        sTextBoxToFind = String.Format("textBoxDuckbill{0}", nextTextBoxNumber);
        TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true).First();
        tb.Focus();
        tb.Text = APlatypusID;
    }

    private void SetFocusOneRowDown(string ATextBoxName) {
        String numericPortionOfTextBoxName = ATextBoxName.Remove(0, LENGTH_OF_TEXT_BOX_BASE);
        String sTextBoxToFind;
        int textBoxNumber = 0;
        int nextTextBoxNumber;

        int.TryParse(numericPortionOfTextBoxName, out textBoxNumber);
        if (!(textBoxNumber == NUMBER_OF_QUARTER_HOURS)) {
            nextTextBoxNumber = ++textBoxNumber;
        } else {
            nextTextBoxNumber = 1;
        }
        sTextBoxToFind = String.Format("textBoxDuckbill{0}", nextTextBoxNumber);
        TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true).First();
        tb.Focus();
    }
4

3 に答える 3

1

.NET 4.0 Winformsコードを介してReSharperを少し掘り下げましたが、「ビープ音」が生成されている場所を見つけることができませんでした。

これは、それが.NETの制御を超えており、ビープ音を発生させるキー入力をブロックすることには至っていないと私に信じさせます。あなたがそれを抑制できるとは思いません。これを停止するために作成したハンドラーは、ビープ音を発生させるコードの後に​​実際に実行される可能性があるため、これを実行しても不十分な場合があります。

(誰かがその答えを探してこれに当たった場合に備えて左)

また、これはあなたが間違った問題を攻撃しているように感じます。私の推測では、アプリのビープ音を頻繁に発生させる操作があります。ビープ音を抑える代わりに、ビープ音の原因を特定して、根本的な問題を解消してみませんか?

編集:

わかりました。背景色を変更するためのコードを確認しました。このプロパティを変更するとシステムビープ音が鳴る理由は実際にはありません。私が想像できる唯一のものは次のとおりです

  1. どこかにハンドラーが接続され.BackColorChangedていて、ビープ音が鳴っています。
  2. たぶん、発生している可能性のある例外でデバッグ環境が壊れていないのかもしれません。

      if (!value.Equals((object) System.Drawing.Color.Empty) && !this.GetStyle(ControlStyles.SupportsTransparentBackColor) && (int) value.A < (int) byte.MaxValue)
         throw new ArgumentException(System.Windows.Forms.SR.GetString("TransparentBackColorNotAllowed"));
    

    .BackColorこれは、コントロールのセッターの最初のコードブロックです。基本的に、使用しているフォームスタイル(テーマ)が透明度をサポートしておらず、提供する色がアルファチャネルで255以外のものである場合、例外がスローされます。エラー処理/デバッグ環境が、その例外がスローされないように設定されている可能性がありますが、飲み込まれ、システムのビープ音がインジケーターである可能性があります。

ここには変数が多すぎて決定的な答えを出すことはできませんが、そこから始めることを強くお勧めします。背景色によってシステムのビープ音が鳴る理由は実際にはありません。私はこれが実際には別のものであることをほぼ保証できます。

これは別の症状であり、ビープ音を単に抑制するだけで、他の場所で他のエラーを引き起こしている可能性のある根本的な問題を実際に隠すことができます。

特定の何かに対して明確に定義された一連のアクションがない限り、エラー/例外を非表示にしないことが一般的なベストプラクティスです。これが、ブラインドトライ/キャッチが当然のことと見なされるため推奨されない理由であり、別のエラーがそのトラップに該当する場合、それを見つけて修正するために必要なデバッグ情報を取得できません。

于 2012-05-22T23:56:45.740 に答える
1

キーを処理済みとして設定する必要があります。

    e.Handled = true

または場合によっては:

    e.SuppressKeyPress = true

編集:気にしないでください、OPはそれが無効なキーを押すビープ音ではないと述べました。

于 2012-05-23T00:00:27.207 に答える
0

KeyPress イベントの下部にあるこのコードを変更したら:

if ((e.KeyChar == '1') ||
    (e.KeyChar == '2') ||
    (e.KeyChar == '3')) {
    buttonSave.Enabled = true;
}

..これに:

if ((e.KeyChar == '1') ||
    (e.KeyChar == '2') ||
    (e.KeyChar == '3')) {
    buttonSave.Enabled = true;
    e.Handled = true;
    tb.Text = e.KeyChar.ToString();
}

..それはことわざのチャーム ブレスレットのように機能します。IOW、キーの入力を許可しないように指示し(有効でしたが)、プログラムでそこに配置する必要がありました。

なぜこれが機能するのか、または「このようにしなければならない」のかはわかりませんが、機能するので、多かれ少なかれ満足しています.

于 2012-05-24T22:36:25.990 に答える