タイトル : Re: Labelのダブルクリックでテキストのコピーが邪魔 投稿日 : 2025/05/27(Tue) 11:46 投稿者 : 魔界の仮面弁士
> マイクロソフトの中の○×△□がバージョンアップするときに余計なことをしたらしいです。 > Labelをダブルクリックをすると、Label.Textがクリップボードに自動コピーされるように変わったそうです。 少なくとも 15 年以上前からそういう動作になっていますね。 「XP Visualスタイルを有効にする」をオフにした場合は無効化されます。 Vista 以降に限定されていて、Windows XP だとコピーされないんじゃなかったかな…? これは OS 側の仕様なので、非 .NET アプリでもコモンダイアログ上のラベルでは同様の動作になります。 C++ のスタティックコントロールでは、ダブルクリックでコピーされないのですけれどね。 > 新しいバージョンではe.Cancel=Trueで自動コピーを停止できますが、 > 古いバージョンではe.Cancelのメンバー自体がありません。 少なくとも .NET 8.0 や .NET Framework 4.8.1 においては、 Label の DoubleClick / MouseDoubleClick イベントに e.Cancel を確認できませんでした。 具体的には、どのバージョンのどのイベント(またはオーバーライダブルメソッド)のことを指していますか? > 仕方が無いのでコーディングしてみました。 メッセージを追跡してみると、 WM_LBUTTONDBLCLK WM_GETTEXTLENGTH WM_GETTEXT WM_LBUTTONUP が飛んできているので、ダブルクリック後のテキスト操作を握りつぶしてしまってはどうでしょうか? たとえば、Label クラスを Inherits した自作クラスを用意してこんな感じ。 Public Class LabelEx Inherits Label Private doubleClicking As Boolean = False Protected Overrides Sub WndProc(ByRef m As Message) Const WM_LBUTTONDBLCLK As Integer = &H203 If m.Msg = WM_LBUTTONDBLCLK Then doubleClicking = True End If MyBase.WndProc(m) End Sub Protected Overrides Sub DefWndProc(ByRef m As Message) Const WM_GETTEXTLENGTH As Integer = &HE If m.Msg = WM_GETTEXTLENGTH AndAlso doubleClicking Then doubleClicking = False Else MyBase.DefWndProc(m) End If End Sub End Class あとは、Form1.designer.vb 内の InitializeComponent で Me.Label1 = New System.Windows.Forms.Label() を Me.Label1 = New LabelEx() に置き換えて使います。文字数 0 を返すことでクリップボード転送されずに 済むようですが、これは実際の動作からの経験則に過ぎず、正規の方法では無いため 他の環境でも使える方法なのかどうかは保証できません。 まぁ、OpenFileDialog で表示されるダイアログの「ファイル名:」ラベルなどは 先述の通り、やはりダブルクリックでコピーされてしまうのですけれどね。 |