tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 で表示されるダイアログの「ファイル名:」ラベルなどは
先述の通り、やはりダブルクリックでコピーされてしまうのですけれどね。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。