C#で2つのキーを使ったショートカットを設定する(CTRL+V)
概要
普通に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
問題点
フォーカスが対象のコントロールでないとイベントが発生しない
このソースの例だとTextBoxが選択されていないとキーを押してもイベントが発生しない
→そりゃそうだ。TextBoxのイベントなんだから
"CTRL" → "V" なら反応するが "V" → "CTRL" だと反応しない
気付いたが眠すぎるので問題解決を図ろうともしていない(残業週間が過ぎ去ったら調べる)
なので同時押しに見えてVの方が先だと処理が実行されない
文字キーの後だと装飾子キーが取得できないとかそんな感じ?
20171122追記
そりゃそうだ、CTRLで装飾されたVだからペーストできるのに何言ってんだ
普通のテキストエディタでもV押した後にCTRL押してもVが入力されるだけってのに
眠さ極限の業務中昼前に思った。
反応しない書き方
if (e.KeyCode == (Keys.Control & Keys.V))
この書き方だと反応しなかった。
ネットで調べた感じこんな書き方してる人もいたんだけどなー