概要
C#でWindowsのショートカットキー的なのを設定する。
普通にKeyDownイベントでイベント発生時に押下されているキー情報を取得して目的のキーが押下されているか比較する。
学生時代にキーイベントはかすかにやった記憶があるけど全く覚えてなかったので復習がてらやってみた。
CTRL+Vでペースト的なことをやりたかった。
目次
ソース
private void textBox1_KeyDown(object sender, KeyEventArgs e){
//押下されているキーを取得
if (e.KeyCode == Keys.V && e.Control == true)
//この書き方だと反応しない
//if (e.KeyCode == (Keys.Control & Keys.V))
{
//クリップボードからテキスト取得
string temp = Clipboard.GetText();
textBox1.Text = temp;
Console.WriteLine(temp);
}
}
キーが押された時点でイベントが発生しCTRL + Vの同時押しでテキストボックスにクリップボードのテキストが格納される。
テキストボックスはReadOnlyプロパティをTRUEにしてやってます。
結果できにはペーストっぽいことができているけど問題点がいろいろ。後述する。
覚書
- イベントの優先順位
KeyDown > KeyPress > KeyUp - Keys.ControlとKeys.ControlKeyは違うっポイ
Control Ctrl キーを押し修飾子キーです。
ControlKey CTRL キー。
マイクロソフトさんどーゆーこっちゃ
単品かほかのキーを装飾する意味のコントロールキーかって感じの勝手な解釈?
(そのうちちゃんと調べる。)
問題点
- フォーカスが対象のコントロールでないとイベントが発生しない
このソースの例だとTextBoxが選択されていないとキーを押してもイベントが発生しない
→そりゃそうだ。TextBoxのイベントなんだから - “CTRL” → “V” なら反応するが “V” → “CTRL” だと反応しない
気付いたが眠すぎるので問題解決を図ろうともしていない
なので同時押しに見えてVの方が先だと処理が実行されない
文字キーの後だと装飾子キーが取得できないとかそんな感じ?
20171122追記
そりゃそうだ、CTRLで装飾されたVだからペーストできるのに何言ってんだ
普通のテキストエディタでもV押した後にCTRL押してもVが入力されるだけってのにあとから気がついた。
反応しない書き方
if (e.KeyCode == (Keys.Control & Keys.V))
この書き方だと反応しなかった。
ネットで調べた感じこんな書き方してる人もいたんだけどなー
参考サイト様
- https://dobon.net/vb/dotnet/control/keyevent.html 🔗
- http://sssoftware.main.jp/csharp/tips/shortcut_keys.html 🔗
- https://builder.japan.zdnet.com/blog/10507800/2009/01/15/entry_27019309/ 🔗
- https://msdn.microsoft.com/ja-jp/library/system.windows.forms.keys(v=vs.110).aspx 🔗
雑感
なんかアイデアはあるんだけど頭の中と手の動きが一致しないので一個ずつつぶしていく作戦に出た。
とりまショートカットキー使ったペーストがやりたかっただけ
PUBGの配信見ながら作業やってたら何も進まなかったね
見るのやめたらすぐできた。