Jump to content
Sign in to follow this  
therks

Stop double click from copying label contents to clipboard?

Recommended Posts

therks

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
trancexx

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
PhoenixXL

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
PhoenixXL

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
Melba23

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

 

Share this post


Link to post
Share on other sites
PhoenixXL

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
therks

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
rover

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  

  • Similar Content

    • coffeeturtle
      By coffeeturtle
      Programs like Ditto are a great augmentation to the Windows clipboard where it keeps a list of items you copy and paste and you can go back to days, weeks, months later. It also comes in handy for multiple copied items you need to paste over and over again.
      https://sourceforge.net/projects/ditto-cp/
      Windows 10 also now has a clipboard history capability (though not as robust, I think, as Ditto).
      https://www.windowscentral.com/how-use-new-clipboard-windows-10-october-2018-update
      I would like to simulate this type of clipboard history into my own apps independent of Windows' clipboard, but I haven't a clue as to where to begin.
      Thank you in advance for any suggestions, examples, shelved codes. ☺
    • Valiante
      By Valiante
      I'm creating a tool which automatically saves screenshots.  I've found that some images appear corrupt after saving.  I've narrowed the source down to screenshots taken from within an RDP session via the Ctrl+Alt+Plus (PrtScn equivalent) and Ctrl+Alt+Minus (Alt+PrtScn equivalent) key combos.
      Here is the example code:
      #include <ClipBoard.au3> #include <GDIPlus.au3> If _ClipBoard_IsFormatAvailable($CF_BITMAP) Then ConsoleWrite("+Bitmap found on Clipboard" & @CRLF) If Not _ClipBoard_Open(0) Then MsgBox(16, "Error", "_ClipBoard_Open failed") Exit EndIf $hClipboardImage = _ClipBoard_GetDataEx($CF_BITMAP) _ClipBoard_Close() _GDIPlus_Startup() $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hClipboardImage) $sCLSID = _GDIPlus_EncodersGetCLSID("JPG") _GDIPlus_ImageSaveToFileEx($hBitmap, @ScriptDir & "\" & TimerInit() & "_Clipboard_Image.jpg", $sCLSID, 0) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() Else MsgBox(48, @ScriptName, "No Bitmap found on Clipboard") EndIf If you copy a local window to the clipboard via Alt+PrtScn the above works fine.  If you copy a window in an RDP session via Ctrl+Alt+Minus it saves the image, but the left-hand edge appears to contain a few pixels sliced off the right-hand side of the bitmap (see two attached images for examples; one good, one bad).  If you paste directly into MSPaint, the image appears correctly, so the clipboard contents is good. It seems to be the process of converting the bitmap handle to an image file via GDIPlus which corrupts it (though I may be wrong about this).
      I've tried inspecting the contents of the clipboard via the _ClipBoard_EnumFormats example and I've noticed the clipboard from the RDP session contains a couple more formats;
      Local:
      Clipboard formats ..: 3 Clipboard format 1 .: Bitmap Clipboard format 2 .: DIB Clipboard format 3 .: DIB V5 RDP:
      Clipboard formats ..: 5 Clipboard format 1 .: DataObject Clipboard format 2 .: DIB Clipboard format 3 .: DIB V5 Clipboard format 4 .: Ole Private Data Clipboard format 5 .: Bitmap However the _ClipBoard_GetDataEx function is specifying the $CF_BITMAP constant for the format, which both instances contain, so I'm not sure the extra formats have any impact?
      I've tried using a combination of _ClipBoard_GetDataEx($CF_DIB) and _GDIPlus_BitmapCreateFromMemory in an effort to write the binary directly to a file, instead of using a bitmap handle, however this doesn't appear to work and just returns a zero and doesn't set @error to anything, which isn't covered in the help file (a failure should return a zero and set the @error level to something).
      I've hunted around the forums and tried everything I can think of. I can normally figure most things out without posting but I've been dipping in and out of this script for a few months now and have finally thrown in the towel and must ask you guys for help, which isn't a decision I take lightly.  Your help is, as always, greatly appreciated.


    • Epic007
      By Epic007
      Hey guys I'm stuck with a program.....I need a make an automation which copies text from a chat bot app and paste it in notepad to log the replies of my chat bot and to analyse stuff....a lil help pls
       
       
       
       
       
       
       
      Thanks in advance
    • AnonymousX
      By AnonymousX
      Hello,
      I'm trying to write a script that moves copies excel cells into an array. I'll than manipulate the values and send array into another program. 
      I don't want range to be specific to a workbook, or sheet, or set of cells.
      I want user to be able to highlight desired cells and to copy either normally ("Ctrl+C") or by a hotkey ("Alt+C"). 
      Could someone help me with this?
      Thank you,
      I've tried to write the framework: (edited)
      #include <MsgBoxConstants.au3> #include <Array.au3> #include <Excel.au3> HotKeySet("!v", "Pastedata") While True Sleep(1000) WEnd func Makearray() local $bArray ;User has cells already copied ;Convert clipboard into an array ;I don;t know how excel stores data to clipboard so don;t know how to bring it into array _Arraydisplay($bArray) MsgBox(0,0,$bArray) return $bArray endfunc func Pastedata() Local $aArray MsgBox(0,0,"wait",1) ;make array based on assumption user has already copied a range to clipboard $aArray = Makearray() ;paste code ;don;t worry about this I got the rest endfunc  
    • WoodGrain
      By WoodGrain
      Hi guys,
      I'm learning about GUI's, I'm trying the below code, the idea being if I press the letter "e" while I have the GUI open I want the label color to change to green (I'm using a UDF for label colors). But every time I press "e" on my keyboard I just get a "ding" sound from my speakers and nothing changes with the label.
      I've looked at using something like "While GUIGetMsg() <> $GUI_EVENT_CLOSE" as I've seen it in other code instead of "While 1", but I don't think it's relevant.
      #include <GUIConstantsEx.au3>; for GUI... #include <GUIRichLabel.au3>; UDF for rich text label fonts #include <Misc.au3>; for _IsPressed $myLetter = "e" $hGUI = GUICreate("test", 700, 60) $lbl2 = _GUICtrlRichLabel_Create($hGUI, '<font color="purple">' & $myLetter & '</font>', 10, 10); , 260, 25 GUISetState(@SW_SHOW) Local $hDLL = DllOpen("user32.dll") While 1 if _IsPressed(Hex($myLetter), $hDLL) Then While _IsPressed(Hex($myLetter), $hDLL) Sleep(250) WEnd _GUICtrlRichLabel_SetData($lbl2, '<font color="green">' & $myLetter & '</font>') Sleep(2000) DllClose($hDLL) Exit EndIf Sleep(50) WEnd DllClose($hDLL) I am using an array of letters that I'm wanting to do this for, but as I can't get it to work I've stripped it down to the simplest code I can think of to try and get this working first. Appreciate any help.
      Thanks!
×