私は何年もC#( Windows Forms )を使用していますが、脳の障害が発生していて、ユーザーの入力をキャッチする方法を一生理解できません。 Ctrl + C テキストボックスに。
私のアプリケーションは基本的にターミナルアプリケーションであり、 Ctrl + C Copy to Clipboardのショートカットではなく、(byte)3
をシリアルポートに送信します。
テキストボックスのショートカットenabled
プロパティをfalseに設定しました。しかし、ユーザーがヒットしたとき Ctrl + C、keypressイベントは発生しません。
キーダウンをキャッチすると、ユーザーが押すとイベントが発生します Ctrl (つまり、ヒットする前に C キー)。
私が見逃しているのは、おそらくばかげて単純なことです。
先に進み、KeyDownイベントを使用しますが、その場合はbothを確認してください。 Ctrl そして C、 そのようです:
if (e.Control && e.KeyCode == Keys.C) {
//...
e.SuppressKeyPress = true;
}
また、基になるTextBoxによるキーストロークの処理を防ぐには、図のようにSuppressKeyPressプロパティをtrueに設定します。
重要なイベントは次の順序で発生します。
KeyPressイベントは、文字以外のキーでは発生しません。ただし、文字以外のキーはKeyDownイベントとKeyUpイベントを発生させます。コントロールは文字以外のキーです。
次のコード行で確認できます:if (e.KeyData == (Keys.Control | Keys.C))
キャッチに問題がありました Ctrl + CTextBox
by KeyDown
。 Control
とControl
の両方が押されたときにのみ、C
キーを取得しました。解決策はPreviewKeyDown
を使用していました。
private void OnLoad()
{
textBox.PreviewKeyDown += OnPreviewKeyDown;
textBox.KeyDown += OnKeyDown;
}
private void OnPreviewKeyDown( object sender, PreviewKeyDownEventArgs e)
{
if (e.Control)
{
e.IsInputKey = true;
}
}
private void OnKeyDown( object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.C) {
textBox.Copy();
}
}
D'oh!ちょうどそれを理解しました。考えられる3つのイベントのうち、私が試したことのないイベントが必要なイベントです。 KeyUpイベントは重要なイベントです。
private void txtConsole_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.C | Keys.Control))
{
_consolePort.Write(new byte[] { 3 }, 0, 1);
e.Handled = true;
}
}
次のことを試してください。 up arrow そして down arrow イベント。検出したとき down arrow CTRLの場合、フラグを設定します。検出したとき up arrow、フラグをリセットします。を検出した場合 C フラグが設定されている間にキーを押すと、 Ctrl+C。
編集。痛い...ジェイの答えは間違いなく良いです。 :-)
新しいバージョンでの変更によるものなのか、これをListBoxで使用しようとしているためなのかはわかりませんが、KeyDownから取得したe.Control
にはKeyEventArgs e
がありません。
私は解決策を回避する必要がありました、私はこれを思いつきました(それは最も美しいものではありませんが、それはうまくいきます):
private List<Key> KeyBuff = new List<Key>();
private void ListBox_KeyDown(object sender, KeyEventArgs e)
{
if (!KeyBuff.Exists(k => k == e.Key))
KeyBuff.Add(e.Key);
if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) &&
KeyBuff.Exists(k => k == Key.C))
{
// Desired detection
Clipboard.SetText(SelectedText);
}
}
private void ListBox_KeyUp(object sender, KeyEventArgs e)
{
KeyBuff.Clear();
}
KeyPress Event
でこのようなキーの組み合わせをキャッチしたい場合は、次の表を参照してください。
Non-Printing Characters
セクションでは、各組み合わせのDec番号を確認できます。たとえば、 Ctrl + C は3
です。したがって、次のようにKeyPressイベントでキャッチできます。
private void btnTarget_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != 3) // if it is not Ctrl + C
{
// do something
}
}
私の場合、KeyDownイベントでは機能しないため、PreviewKeyDownで試してみましたが、機能しました。
private void txt_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.Control == true && e.KeyCode == Keys.C)
{
Clipboard.SetText(txt.SelectedText);
}
}