2

私はTextBox(複数行)を持っていて、それを押すCtrl+Enterと新しい行が作成されます。しかし、私もこれを行いたいと思いますShift+Enter。私は試した:

messageTextBox_KeyDown(null, new KeyEventArgs(Keys.Control | Keys.Enter));

しかし、これは機能していません。

私はこれを行うことができると思います:

int lastSelectionStart = messageTextBox.SelectionStart;
messageTextBox.Text = messageTextBox.Text.Insert(messageTextBox.SelectionStart, Environment.NewLine);
messageTextBox.SelectionStart = lastSelectionStart;

しかし、私はこれが好きではありません。

Shift+EnterがCtrl+Enterと同じになるようにするにはどうすればよいですか?

私の現在のコード:

KeyDownEvent

if (e.KeyCode == Keys.Enter)
{
    e.Handled = true;
    if (e.Shift)
    {

    }
    else if (!e.Control)
    {
        sendButton_Click(null, null);
    }
}

KeyPressイベントの場合:

if (e.KeyChar == (char)13)
{
    e.Handled = true;
    return;
}

これは、Enterキーだけを送信ボタンとして使用したいためです。

4

1 に答える 1

2

あなたが戦っている本当の問題は、フォームの AcceptButton プロパティのように思えます。これを KeyDown イベント ハンドラで修正することはできません。キーストロークはイベントに到達するに処理されます。

これは、フォームの ProcessCmdKey() メソッドをオーバーライドすることで修正できますが、最もクリーンな方法は、独自の TextBox 派生コントロールを作成することです。その IsInputKey() メソッドをオーバーライドして、Ctrl+Enter キーを表示することを Winforms に伝えることができます。プロジェクトに新しいクラスを追加し、以下に示すコードを貼り付けます。コンパイル。ツールボックスの上部から新しいコントロールをドロップします。クラスを自分の都合に合わせて変更して、チャットの入力ボックスとしての機能を向上させる方法に注意してください。

システムを使用する; System.Windows.Forms を使用します。

class ChatBox : TextBox {
    public ChatBox() {
        this.Multiline = true;
    }
    protected override bool IsInputKey(Keys keyData) {
        if (keyData == (Keys.Shift | Keys.Enter)) return true;
        return base.IsInputKey(keyData);
    }
    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyData == (Keys.Shift | Keys.Enter)) {
            int pos = this.SelectionStart;
            this.SelectedText = Environment.NewLine;
            this.SelectionStart = pos;
            e.Handled = e.SuppressKeyPress = true;
            return;
        }
        base.OnKeyDown(e);
    }
}
于 2012-09-23T16:45:20.623 に答える