lisz-works

技術系だけど関係ないこと多い系ブログ

C# KeyPressでCtrl+Enterを判定する

【スポンサーリンク】

Visual Studio 2017ロゴ

今回はC#のWindowフォームアプリケーションにて、Textbox上でCtrl+Enterを押されたことを判定する方法についてです。

最近C#のWindowフォームアプリケーションで、ちょっとしたGUIアプリを作っています。

そのときTextboxを設置し、そこで「Ctrl+Enterを押したとき、ある処理を行う」という処理を作るつもりでした。

「まぁサクッといくっしょ」

と思っていたのも束の間、躓きました……

こちらの解決方法についてです。
(普段GUIアプリをあまり作ってないのがバレる……)

解決方法

まずは解決方法です。

サクッとこんな感じ。

if ( ( e.KeyChar == (char)Keys.LineFeed ) && ( Control.ModifierKeys == Keys.Control ) )

解説

Enterキーを取るには

まずEnterキーを取るには、このようにすればいけます。

private void xxx_KeyPress(object sender, KeyPressEventArgs e)
{
    if ( (e.KeyChar & (char)Keys.Enter) == (char)Keys.Enter )
    {
        // 処理
    }
}

Ctrlキーを取るには

Ctrlキーはこんな感じ。

private void xxx_KeyPress(object sender, KeyPressEventArgs e)
{
    if ( (Control.ModifierKeys & Keys.Control ) == Keys.Control )
    {
        // 処理
    }
}

単純に複合すると……できない

ということはですよ。

2つを合わせて

if ( ((e.KeyChar & (char)Keys.Enter) == (char)Keys.Enter) && ( Control.ModifierKeys & Keys.Control ) == Keys.Control )

で取れるのでは!?と思うわけですよ。

しかし……うまく取れない……

ブレークして値を見てみると

  • e.KeyChar:0x0A
  • Control.ModifierKeys:Control

となっている。しかし、Enterの値はいくつかというと

  • (char)Keys.Enter:0x0D

e.KeyCharで取れてる値が違う……

解決と原因

色々調べまわってたらわかったー!!

これで解決。

if ( ( ( e.KeyChar == (char)Keys.Enter ) || ( e.KeyChar == (char)Keys.LineFeed ) ) && ( Control.ModifierKeys == Keys.Control ) )

これでもOK!こっちの方が短いですね。

if ( ( e.KeyChar == (char)Keys.LineFeed ) && ( Control.ModifierKeys == Keys.Control ) )

よくよく考えると、Enterは「改行」ですよね。

だから「0x0D:'\r'」が取れていたようです。

っていうか、キーコード的には、改行って「\r」扱いなんですね。初めて知ったわ。

しかし、Ctrlキーを同時入力することで、「\n」に扱いが変わるようです。

きっとシステム的な問題なんでしょう(ってことにしとく)。

なのでCtrl+Enter入力時には、「0x0A:'\n'」が取れていたようです。

今回はKeys.Enter(\r)としていたところを、Keys.LineFeed(\n)とすることで解決しました。

あとがき

さて、あまりGUIアプリを作っていなかったことが露見しましたね。

いや作ってはいるんですよ?
でもボタンクリックしか使わないみたいな単純なものばかりで……

そんなことはどうでもいいので、何かのお役に立てると幸いですー。