※去年(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のダブルクリックでコピーされてしまう
強制処理が、無効化出来るような構造になるまでは、
自力で回避策を整えなければいけません。