Sign in to follow this  
Followers 0
therks

Stop double click from copying label contents to clipboard?

9 posts in this topic

#1 ·  Posted (edited)

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

Share this post


Link to post
Share on other sites



Damn, 2 weeks and nothing?

Share this post


Link to post
Share on other sites

It's a feature of Static controls. If you don't want it then remove SS_NOTIFY style.


♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

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.

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

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

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______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

 

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

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.

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

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

Share this post


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...

Share this post


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
Sign in to follow this  
Followers 0

  • Similar Content

    • rudi
      By rudi
      Hello.
      I fail trying to save content from WhatsApp other then plain text to a file that way, that non-char-content will be preserved in it's correct encoding. e.g. Emojis are spoiled.
      I've tried to do so using just filewrite() as well as forcing UTF
      #include <clipboard.au3> MsgBox(0,"Ready to read clipboard","Mark some WhatsApp content with non-char elements, e.g. Emojis, copy that to your clipboard (CTRL+c), then click OK here.") $ClipContent=_ClipBoard_GetData() ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ClipContent = ' & $ClipContent & @CRLF & '>Error code: ' & @error & @CRLF & "Extended: " & @extended & @CRLF) ;### Debug Console $File="C:\temp\ClipSaveToFile.txt" $h=FileOpen($File,2+8+64) ; overwrite, create path, UTF16 FileWrite($h,$ClipContent) FileClose($h) $h=FileOpen($File,64) $NeuGelesen=FileRead($h) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $NeuGelesen = ' & $NeuGelesen & @CRLF & '>Error code: ' & @error & @CRLF & StringLen ($NeuGelesen) & @CRLF ) ;### Debug Console FileClose($h) _ClipBoard_SetData($NeuGelesen) MsgBox(0,"Done","Re-read content of TEMP file was placed to the clipboard. Now paste this into WhatsApp. (Emojis will be spoiled)") I've also tried other encodings (16, 32, 64, 512)

      Or what is a different, functional approach to save WhatsApp Content to File in a way, to be able to to get it back to post it back to WhatsApp?

      Regards, Rudi.
    • AndreyS
      By AndreyS
      Hello to you, dear developers!
      Could you please tell me if there is an easy way to determine if the information was pasted from the clipboard?
      Without any variation of the insertion via Ctrl+V, or through the context menu.
      I revised the Help and many forum topics, but found nothing suitable.
      Can there be any WinAPI system events that determine this event?
    • thoms
      By thoms
      Hello Forum,
      I'm trying to vertically center text in label controls, but no way. The search on the forum returns no result, or I don't search the right way
      When I insert a button and a label of same size close to each other, the text is centered on the button, but top aligned on the label, or edit. Which doesn't look really aesthetic
      Any idea is welcome
      Thanks in advance,
      Thoms
    • Nareshm
      By Nareshm
      Hi All,
      I have excel file like this
      and i want to cut cell/text from excel to other software.

       
      I have to cut the cell of B column one by one and past into other software
      If Winexists("No Data Found")
      then restore cuted cell and goto next/down side cell
      How to do it ?
    • Nareshm
      By Nareshm
      Its possible to past previously copied text to somewhere with autoit script ?
      If yes, How it ?
      example : Before I copied ABCD and then copied the PQRS, how to past the previously copied ABCD ?