Jump to content

Stop double click from copying label contents to clipboard?


Recommended Posts

I'm not sure when this started happening but it's very annoying and it took me a while to realize it wasn't a bug in my code. Is there some way to keep this from happening? Is it a bug or a feature? I checked on a few other Static controls in Windows and it doesn't copy on double click so I can only think it's AutoIt exclusive.

AutoIt:3.3.9.5 (Os:WIN_7/SP1/X64 OSLang:0409)

Example:

#include <GUIConstants.au3>

$hGUI = GUICreate('', 150, 100)
GUICtrlCreateLabel('Double click me', 5, 5, 100, 20)
GUISetState()

ClipPut('Example')

While 1
    ToolTip('ClipGet() = ' & ClipGet())
    $iGUIGetMsg = GUIGetMsg()
    Switch $iGUIGetMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd
Edited by therks
Link to post
Share on other sites
  • 2 weeks later...

The reason of this problem is that the Label receives the WM_GETTEXT message when we double click on it. To stop this behavior, we can ignore the WM_GETTEXT message when double-clicking operation happens.

To do this, create a new class derived from the Label class and override the WndProc method. In the override method, if the Label has received the WM_LBUTTONDBLCLK message before it receives the WM_GETTEXT message, we ignore the WM_GETTEXT message.

The following is a sample:

class MyLabel:Label

{

int WM_GETTEXT = 0xD;

int WM_LBUTTONDBLCLK = 0x203;

bool doubleclickflag = false;

protected override void WndProc(ref Message m)

{

if (m.Msg == WM_LBUTTONDBLCLK)

{

doubleclickflag = true;

}

if (m.Msg == WM_GETTEXT && doubleclickflag)

{

doubleclickflag = false;

return;

}

base.WndProc(ref m);

}

}The reason of this problem is that the Label receives the WM_GETTEXT message when we double click on it. To stop this behavior, we can ignore the WM_GETTEXT message when double-clicking operation happens.

But how to use this class through Autoit [i dont have any idea]

I got this from this Link

Its not just for Autoit, its for all the Static controls in Windows Vista and above

try Subclassing

orelse try tracking the doubleclick event and restore the Clipboard

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites

i tried to remove the SS_NOTIFY but it didnt work

This will work

Create the label with $SS_SIMPLE

& Disable the Label

This will stop receive you messages from the label and the text wont be copied

Code

#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$hGUI = GUICreate('', 150, 100)
GUICtrlCreateLabel('Double click me', 5, 5, 100, 20,0x0B)
GUICtrlSetState(-1,$GUI_DISABLE)
GUISetState()

ClipPut('Example')

While 1
ToolTip('ClipGet() = ' & ClipGet())
$iGUIGetMsg = GUIGetMsg()
Switch $iGUIGetMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
If $iGUIGetMsg > 0 Then
ToolTip($iGUIGetMsg &amp; ':' &amp; GUICtrlRead($iGUIGetMsg))
EndIf
EndSwitch
WEnd
Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites
  • Moderators

PhoenixXL,

Removing the SS_NOTIFY style is just one line: ;)

#include <GUIConstants.au3>

$hGUI = GUICreate('', 150, 100)
GUICtrlCreateLabel('Double click me', 5, 5, 100, 20)
GUICtrlSetStyle(-1, 0) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
GUISetState()

ClipPut('Example')

While 1
    ToolTip('ClipGet() = ' & ClipGet())
    $iGUIGetMsg = GUIGetMsg()
    Switch $iGUIGetMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case Else
            If $iGUIGetMsg > 0 Then
                ToolTip($iGUIGetMsg & ':' & GUICtrlRead($iGUIGetMsg))
            EndIf
    EndSwitch
WEnd

Your subclassing idea is interesting but I am not sure that it is entirely correct. When I subclass the label as you propose I certainly do not get the content of the label on a double click, but the clipboard content is still erased: :(

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

OnAutoItExitRegister("_AutoExit")

Global $fDblClk = False

; Register callback function and obtain handle to _New_WndProc
$hNew_WndProc = DllCallbackRegister("_New_WndProc", "int", "hwnd;uint;wparam;lparam")

; Get pointer to _New_WndProc
Local $pNew_WndProc = DllCallbackGetPtr($hNew_WndProc)


$hGUI = GUICreate('', 150, 100)
$clabel = GUICtrlCreateLabel('Double click me', 5, 5, 100, 20)
GUISetState()

; Store old WndProc
$pOld_WndProc = _Label_SubClass(GUICtrlGetHandle($cLabel), $pNew_WndProc)


ClipPut('Example')

While 1
    ToolTip('ClipGet() = ' & ClipGet())
    $iGUIGetMsg = GUIGetMsg()
    Switch $iGUIGetMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case Else
            If $iGUIGetMsg > 0 Then
                ToolTip($iGUIGetMsg & ':' & GUICtrlRead($iGUIGetMsg))
            EndIf
    EndSwitch
WEnd


Func _New_WndProc($hWnd, $iMsg, $wParam, $lParam)

    ; Set DBLCLK flag if one detected
    If $iMsg = 0x203 Then
        $fDblClk = True
    EndIf

    ; If GETTEXT message sent
    If $iMsg = 0x000D Then ; WM_GETTEXT
        ; Check state of DBLCLK flag
        If $fDblClk Then
            ; Clear flag
            $fDblClk = False
            ; Ignore specific message from subclassed control
            Return 0
        Else
            ; Pass message to original WindowProc
            Return _WinAPI_CallWindowProc($pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)
        EndIf
    Else
        ; Pass other messages to original WindowProc
        Return _WinAPI_CallWindowProc($pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam)
    EndIf

EndFunc   ;==>_New_WndProc

Func _Label_SubClass($hWnd, $pNew_WindowProc)

    Local $iRes = _WinAPI_SetWindowLong($hWnd, -4, $pNew_WindowProc)
    If @error Then Return SetError(1, 0, 0)
    If $iRes = 0 Then Return SetError(1, 0, 0)
    Return $iRes

EndFunc   ;==>_Label_SubClass

Func _AutoExit()

    ; Unsubclass the label
    _Label_SubClass(GUICtrlGetHandle($cLabel), $pOld_WndProc)
    ; Now free UDF created WndProc
    DllCallbackFree($hNew_WndProc)

EndFunc

So I think there is something else going on with the clipboard. ;)

Anyway, trancexx's solution works fine - and is a lot simpler! :D

M23

Edit:

In fact all you need to do is to prevent the DBLCLK message being actioned: ;)

Func _New_WndProc($hWnd, $iMsg, $wParam, $lParam)

    If $iMsg = 0x203 Then
        Return 0
    EndIf

EndFunc   ;==>_New_WndProc

But I would still just remove the SS_NOTIFY style. :)

Edited by Melba23
Added code

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to post
Share on other sites

Yup

removing SS_NOTIFY works that way

but this is even the same thing i guess then why isnt this working

#include <GUIConstants.au3>

$hGUI = GUICreate('', 150, 100)
GUICtrlCreateLabel('Double click me', 5, 5, 100, 20,0)
;GUICtrlSetStyle(-1, 0) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
GUISetState()

ClipPut('Example')

While 1
ToolTip('ClipGet() = ' & ClipGet())
$iGUIGetMsg = GUIGetMsg()
Switch $iGUIGetMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
If $iGUIGetMsg > 0 Then
ToolTip($iGUIGetMsg & ':' & GUICtrlRead($iGUIGetMsg))
EndIf
EndSwitch
WEnd

and BTW does the following work

#include-once
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$hGUI = GUICreate('', 150, 100)
GUICtrlCreateLabel('Double click me', 5, 5, 100, 20,0x0B)
GUICtrlSetState(-1,$GUI_DISABLE)
GUISetState()

ClipPut('Example')

While 1
ToolTip('ClipGet() = ' & ClipGet())
$iGUIGetMsg = GUIGetMsg()
Switch $iGUIGetMsg
Case $GUI_EVENT_CLOSE
ExitLoop
Case Else
If $iGUIGetMsg > 0 Then
ToolTip($iGUIGetMsg & ':' &GUICtrlRead($iGUIGetMsg))
EndIf
EndSwitch
WEnd
Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to post
Share on other sites

Unfortunately I can't just disable double clicking entirely in my program because I'm actually using the double click to trigger something. I just don't want it to affect the clipboard.

*Edit: I actually thought that copying label contents to clipboard on double click was something that happened only recently, and I was thinking it was almost bug-like, but I just found an old compiled script (3.1.1.61) and labels in it do the same thing, so I guess I just over looked it all this time.

*Edit 2: Although I just tested on a WinXP VM and it doesn't copy, so maybe that's where I'm getting mixed up (I haven't done nearly as much scripting since I moved to Win 7).

Edited by therks
Link to post
Share on other sites

Stop double click from copying label contents to clipboard?

CS_DBLCLKS style issue again.

My solution for the static/button click lag/slowdown issue a few years back solves this one too.

#include <GUIConstants.au3>
#include <WinAPIEx.au3>

$hGUI = GUICreate('', 150, 100)
$cLbl = GUICtrlCreateLabel('Double click me', 5, 5, 100, 20)
_Remove_CS_DBLCLKS(-1)
GUISetState()

ClipPut('Example')

While 1
ToolTip('ClipGet() = ' & ClipGet())
$iGUIGetMsg = GUIGetMsg()
Switch $iGUIGetMsg
     Case $GUI_EVENT_CLOSE
         ExitLoop
;Case $cLbl
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $cLbl = ' & $cLbl & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
     Case Else
         If $iGUIGetMsg > 0 Then
             ToolTip($iGUIGetMsg & ':' & GUICtrlRead($iGUIGetMsg))
         EndIf
EndSwitch
WEnd


Func _Remove_CS_DBLCLKS($Ctrl)
;Author; rover 2k9 - updated 2k12
;Requires WinAPIEx.au3
;
;Removes the CS_DBLCLKS style from Static or Button class controls
;Fixes the issue of slow response(lag) with Labels or colour Buttons when rapidly clicking with the mouse
;
;NOTE: Run one time only on the first control created in your script process with the control class you want to remove this style from
;All subsequently created controls of the Static or Button class for the current process will not have the CS_DBLCLKS style
;http://www.autoitscript.com/forum/topic/90309-why-the-huge-performance-hit/page__view__findpost__p__663443
If Not IsHWnd($Ctrl) Then
$Ctrl = GUICtrlGetHandle($Ctrl)
If Not IsHWnd($Ctrl) Then Return SetError(1, 0, 0)
EndIf
If Not IsDeclared("GCL_STYLE") Then Local Const $GCL_STYLE = -26
If Not IsDeclared("CS_DBLCLKS") Then Local Const $CS_DBLCLKS = 0x8
Local $ClassStyle = _WinAPI_GetClassLongEx($Ctrl, $GCL_STYLE)
If @error Or Not $ClassStyle Then Return SetError(2, @error, 0)
Local $NewStyle = BitAND($ClassStyle, BitNOT($CS_DBLCLKS))
_WinAPI_SetClassLongEx($Ctrl, $GCL_STYLE, $NewStyle)
If @error Then Return SetError(3, @error, 0)
Local $ClassChk = _WinAPI_GetClassLongEx($Ctrl, $GCL_STYLE)
If @error Or Not $ClassChk Then Return SetError(4, @error, 0)
If $ClassStyle = $ClassChk Then Return SetError(5, 0, 0)
Return SetError(0, 0, 1)
EndFunc ;==>_Remove_CS_DBLCLKS

I see fascists...

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By vinnyMS
      #Include <Array.au3> #include <Constants.au3> $s = FileRead("2.txt") Local $w = StringRegExp($s, '(?is)(\b\w+\b)(?!.*\b\1\b)', 3) _ArrayColInsert($w, 1) For $i = 0 to UBound($w)-1 StringRegExpReplace($s, '(?i)\b' & $w[$i][0] & '\b', $w[$i][0]) $w[$i][1] = @extended Next _ArraySort($w, 1, 0, 0, 1) _ArrayDisplay($w) i have this script that returns 3 columns  
       
      i need to copy the  Col 0 and Col 1 as text to paste on notepad or excel
      you will have to create a "copy" button if possible
      array.au3 2.txt
    • By MrCreatoR
      This UDF allows to create formatted label using pseudo element RichLabel (RichEdit actually). Formating is set by using special modificator similar to <font> tag in Html.
      Notes: This UDF is a transformation-continuation of related UDF


      Example:
      Download:
      GUIRichLabel_1.2.zip
      Small syntax related fix: GUIRichLabel_1.1.zip
      GUIRichLabel_1.1.zip
       
      History version:
    • By nacerbaaziz
      hello autoit group
      please i've a question
      i had make a function that put some thing into the clipBoard and paste it
      using the send function
      e.g
      ClipPut("hello")
      send("^v")
       
      when the keyboard is english all things work fine
      but when the keyboard is arabic the send command write the ltr v insted of the text in clipboard
      i was tryed to use
      send("{ctrldown}v{ctrlUp}")
      but the same
      please can any one help me
       
    • By rudi
      Hi,
      from other postings here as a start I'm quite Close to my Goal of putting formatted text to the clipboard:
      #include-once #include <GUIConstantsEx.au3> #include <GuiRichEdit.au3> #include <WindowsConstants.au3> Global $g_idLblMsg, $g_hRichEdit Example("The first text will be formatted ""as is""" & @CRLF & _ "(Default Font and font size)", "This text is formatted differently") MsgBox(0, "Rich Text copied", "Formatted Text put to clipboard") Func Example($TextDefault, $TextCourier) Local $hGui, $iMsg, $idBtnNext, $iStep = 0 $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, StringLen(".exe")) & ")", 320, 350, -1, -1) $g_hRichEdit = _GUICtrlRichEdit_Create($hGui, $TextDefault, 10, 10, 300, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL)) $g_idLblMsg = GUICtrlCreateLabel("", 10, 235, 300, 60) GUISetState(@SW_SHOW) _GUICtrlRichEdit_SetSel($g_hRichEdit, -1, -1) ; set selection behind last CHAR in RTF_EDIT _GUICtrlRichEdit_SetFont($g_hRichEdit, 8, "Courier New") ; change font to 8pt, Courier New _GUICtrlRichEdit_AppendText($g_hRichEdit, @CRLF & $TextCourier) _GUICtrlRichEdit_SetSel($g_hRichEdit, 0, -1) ; select all the content of the RTF_EDIT _GUICtrlRichEdit_Copy($g_hRichEdit) ; put the selection to the clipboard EndFunc ;==>Example  
      Finally the clipboard content has to hold pre-formatted data to be pasted into an email body. for the 2nd part I'd like to add a frame around the text, like I did manually before taking this screenshot.



      Any suggestions, or maybe some absolutely different Approach?
       
      CU, Rudi.
×
×
  • Create New...