コントラスト

INput ⇔ OUTput | OUTput ⇔ INput

Windows FormsのLabelの変化

※去年(2015年)末に下書きした記事を今更公開

取り急ぎ忘れてしまいそうなので記事に残す。

何より、これ関連の情報があまり無いってのが 書き残しておく一番の理由です。

 

LabelをダブルクリックするとTextがクリップボードにコピーされる。

 

これを知ったのは業務支援のツールを作成している時でした。

すっかり内製のシステムを組む人になってしまいましたが、

クリップボードのデータをキャッチして、ヒストリー化するという

機能を実装しました。

 

作成の経過報告でマネージャーに見せた際、何故かヒストリーの中に

Labelに設定しているtextが載ってくるのです。

自分はシングルクリックの想定で作成していたのですが、

その人はダブルクリックで操作していました。

 

その時に「ひょっとして……」と調べたら正に前述の通り。

この機能、doubleclickのイベントを実装せずとも

Windows側でclipboardにコピーしてくれます。

 

それを早めに知っていたら、イベントいくつか削れたじゃん…と

思いつつも、便利そうで便利じゃ無い機能なんです。

 

そのコピーやめるわけにはいかないか?

 

msdnやブログ記事などを検索しましたが、アプリケーションから

その機能を切る術がどうも無いそうで。

 

LabelのdoubleclickやmouseDoubleClickイベントで引っ掛けるも、

そのイベントが発生する前にすでにclipboardにコピーされてました。

 

調べた結果、MouseDownイベントでクリック数が2回目の時点でも

clipboardにコピーされていました。

Labelを継承したexLabelというものでチェックしました。

 

何とかLabelのクラス使いつつ、クリップボードの制御が出来ないかと

考えた末、苦肉の策として考えたのがアプリケーションのsettingを

使用した回避策でした。

ちなみに自分はc#で組んでいます。

 

1.exLabelのMouseDownイベントをoverrideし、

  クリック数が1の時点でProperties.setting.Defaultの

  stringにexLabelのTextを代入する

2.シングルクリックだった場合はそのまま。

3.ダブルクリックになった瞬間、2回目のMouseDownイベント

   発生前にクリップボードのキャッチが走る

4.クリップボードでキャッチした際に、Properties.setting.Default

   stringに代入したtextと同じ内容だったら、アプリでデータをシャットアウト。

5.他の動作で支障が出ないよう、シャットアウトした時点で

   Properties.setting.Defaultのstringを空にする。

 

これでアプリ内のヒストリーに載ってくるのは無くなりました。

ダブルクリックで発生するイベントで、さらにダブルクリックした

瞬間に走る処理のため、支障が出る前に「無かったこと」にできる

という作りです。

 

ただし、clipboardにデータが入った事には変わりなく、

アプリ内のヒストリーに載らなくても、すぐにペーストすれば、

exLabelのTextが出てきます。

この辺はヒストリーとってるんだから、直前のヒストリーデータを

clipboardにセットし直せばより隠蔽できます。

 

 

何にしても、Labelのダブルクリックでコピーされてしまう

強制処理が、無効化出来るような構造になるまでは、

自力で回避策を整えなければいけません。