今回は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アプリを作っていなかったことが露見しましたね。
いや作ってはいるんですよ?
でもボタンクリックしか使わないみたいな単純なものばかりで……
そんなことはどうでもいいので、何かのお役に立てると幸いですー。