web-dev-qa-db-ja.com

キーを押したときにctrl + vを検出する

テキストボックスkeypressイベントを使用して、選択した入力のみを処理しています。基本的に、textboxを使用すると、ユーザーは計算可能な値を入力できます。

つまり、_(5*5)- (10/5)_と入力できます。

Convert.ToChar("*")==e.KeyCharなどの現在のメソッドチェック...

現時点では、ユーザーが貼り付け値をコピーすることはできません。

とにかくkeypressイベントで_ctrl+v_を検出できるものはありますか?

更新

私が今していること

_   static IEnumerable<char> ValidFiancialCharacters
       {
           get
           {
               if(_validFiancialCharacters==null)
               {
                 _validFiancialCharacters = new List<char>();

                 _validFiancialCharacters.Add(Convert.ToChar("0"));
                 _validFiancialCharacters.Add(Convert.ToChar("1"));
                 _validFiancialCharacters.Add(Convert.ToChar("2"));
                 // till 9 and
                  _validFiancialCharacters.Add(Convert.ToChar("+"));
                  _validFiancialCharacters.Add(Convert.ToChar("-"));
                  _validFiancialCharacters.Add(Convert.ToChar("/"));
                  //and some other
                }
                return _validFiancialCharacters;
             }
       }


 public static bool ValidateInput(KeyPressEventArgs e)
   {
       if (ValidFiancialCharacters.Any(chr => chr == e.KeyChar))
       {
           e.Handled = false;
       }
       else
       {
           e.Handled = true;
       }
       return e.Handled;
   }
_

そしてキープレスで

_   private void txtRate_KeyPress(object sender, KeyPressEventArgs e)
    {
        NumberExtension.ValidateInput(e);
    }        
_
6
user3090731

両方を処理する必要がある場合は、同様のアプローチを使用して実行できます

キーコード をご覧ください。キーが押されたことを検出できます

そう..

必要なすべての入力を含むリストを作成します

 public List<int> KeyCodes = new List<int>() { 8, 17, 37, 39.....etc}; 

KeyDownイベントを使用し、 KeyEventArgs.SuppressKeyPress プロパティを使用します

private void Txt1_KeyDown(object sender, KeyEventArgs e)
{
    if (KeyCodes.Contains(e.KeyValue) || (e.KeyCode==Keys.V && e.Control))
        e.SuppressKeyPress = false;
    else 
        e.SuppressKeyPress=true;
}

ユーザーは何でも貼り付けることができるため、leave eventにコピーして貼り付けた値を検証する必要がある場合があります!!!

5
huMpty duMpty

KeyPressイベントが何らかの理由で「Ctrl + V」をキャッチしません。 KeyDownイベントを使用します:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.V)
    {
        //Ctrl + V
    }
}

または

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == (Keys.Control | Keys.V))
    {
        //Ctrl + V
    }
}
3

Ctrl + Vシーケンスは、KeyPressEventによってキャッチできます。
次の方法では確認できません。

(Keys)e.KeyChar == Keys.V && Control.ModifierKeys == Keys.Control <br>

使用する必要があります:

(int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control <br>

キーボードがASCII = 22(同期アイドル)を生成するためです。
次の例では、TextBoxがカンマ区切り文字で+-の金額を受け入れることができ、Ctrl + Vで貼り付けることができます。

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if (!( char.IsNumber(e.KeyChar) ||
         ((Keys)e.KeyChar == Keys.Back) ||
         (e.KeyChar == ',') ||
         (e.KeyChar == '-') ||
         ((int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control)
        ))
        {
            e.Handled = true;
        }
        if (e.KeyChar == ',' && base.Text.IndexOf(',') > 0)
        {
            e.Handled = true;
        }
        base.OnKeyPress(e);
    }

KeyPressイベントはCTRLボタンでは発生せず、「文字」ボタンでのみ発生するため、KeyDownまたはKeyUpを使用する必要があります。 KeyDownイベントを使用する場合は、以下をチェックすることでctrl+vを検出できます。

if (e.Control && e.KeyCode == Keys.V)
{
    ...
}
0
Brutus