1

次のコードがあります。これは、ユーザーがメモテキストエディタで新しい行を記述できないようにするためのものです。

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.HasFlag(Keys.Enter))
    {
        e.SuppressKeyPress = true;
    }
}

それは実際にはEnterが挿入されるのを防ぎますが、奇妙なことに、他のキーも挿入されるのを防ぎます。これまでのところ、キー「O」、「M」、「/」、および「-」も「キャッチ」されていることがわかりました。

更新:次のコードは私が必要とすることを行います:

private void m_commentMemoEdit_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyValue == (int)Keys.Return)
  {
    e.SuppressKeyPress = true;
  }
}

しかし、私はまだ前のコードが機能しないことを理解していません、そしてこれは機能します。

私はSystem.Windows.Forms.Keys列挙型を調べましたが、手がかりは見つかりませんでした(ただし、これは奇妙に構築された列挙型の1つであると言わなければなりません)。なぜこれが起こっているのか誰かが説明できますか?

4

3 に答える 3

4

HasFlags() は Enum.HasFlags() から継承されます。[Flags] 属性で宣言された列挙型で役立ちます。& 演算子を使用して、ビット値のテストを行います。問題は、Keys.Enter がフラグ値ではないことです。その値は 0x0d で、3 ビットが設定されています。したがって、ビット 0、2、または 3 がオンになっている値を持つキーはすべてtrue を返します。Keys.O と同様に、値は 0x4f です。0x4f & 0x0d = 0x0d であるため、HasFlags() は true を返します。

実際にフラグ値を表す Keys 値でのみ使用してください。Keys.Alt、Keys.Control、Keys.Shift です。これらは修飾キーであることに注意してください。したがって、HasFlags を使用して、たとえば F と Ctrl+F の違いを確認できます。

Keys.Enter を検出するには、単純な比較を行う必要があります。あなたが知ったように。if() ステートメントは Alt+Enter などにも当てはまることに注意してください。これは、あなたが望むものではないかもしれません。代わりに使用

if (e.KeyData == Keys.Return) e.SuppressKeyPress = true;

修飾キーが押されていない場合にのみ、Enter キーを抑制します。

于 2012-04-15T13:34:14.543 に答える
1

これは、列挙型の基になる値がキーボード コードに直接マップされていることに関係していると思われますがSystem.Windows.Forms.Keys、これは必ずしも相互に排他的ではありません。ドキュメントには、ビット単位の操作を使用してはならないことが記載されており、使用しない理由の例が示されています ( enum の FlagsAttribute に注意してください! )。

MSDNHasFlagはまた、この関数は this: の結果を返すと述べているthisInstance And flag = flagため、ブレークポイントを設定して、実際に入ってくるバイナリ コードを調べ、その操作がリストしたキーのセットに対して true を返すかどうかを確認できます。

最終的に、更新されたコードは、やりたいことを実行するための正しい方法です。

于 2012-04-15T13:21:53.577 に答える
0

HasFlagはフラグ用です-ビットが設定されているかどうかを意味します

キー値は順序値であるため、フラグとは完全に異なり、比較演算子を使用し、すべてが正常である必要があります。

一部の列挙型フィールドはフラグのように定義されます。

enum SomeFlag
{
   BitOne = 1, 
   BitTwo = 2, 
   Bitthree = 4
};

ここでは「HasFlag」を使用するのが理にかなっています

于 2012-04-15T13:30:01.577 に答える