lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

C#で2つのキーを使ったショートカットを設定する(CTRL+V)

概要

  • C#Windowsのショートカットキー的なのを設定する。

普通にKeyDownイベントでイベント発生時に押下されているキー情報を取得して
目的のキーが押下されているか比較する。

学生時代にキーイベントはかすかにやった記憶があるけど
全く覚えてなかったので復習がてらやってみた。

CTRL+Vでペースト的なことをやりたかった。

f:id:HM_Atlas:20171121012546p:plain

ソース

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))

この書き方だと反応しなかった。
ネットで調べた感じこんな書き方してる人もいたんだけどなー

雑感

なんかアイデアはあるんだけど
頭の中と手の動きが一致しないので一個ずつつぶしていく作戦に出た。
イデアっつって業務効率化とかそんな類なんだけど
とりまショートカットキー使ったペーストがやりたかっただけ

PUBGの配信見ながら作業やってたら何も進まなかったね
見るのやめたらすぐできた。