Jump to content



Photo

Stop double click from copying label contents to clipboard?


  • Please log in to reply
8 replies to this topic

#1 therks

therks

    Witty quote

  • Active Members
  • PipPipPipPipPipPip
  • 2,163 posts

Posted 22 June 2012 - 11:04 PM

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, 08 July 2012 - 12:42 AM.






#2 therks

therks

    Witty quote

  • Active Members
  • PipPipPipPipPipPip
  • 2,163 posts

Posted 06 July 2012 - 09:51 PM

Damn, 2 weeks and nothing?

#3 trancexx

trancexx

    Hm, I really shouldn't.

  • Active Members
  • PipPipPipPipPipPip
  • 5,191 posts

Posted 07 July 2012 - 09:09 AM

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

eMyvnE


#4 PhoenixXL

PhoenixXL

    Be what you are, believe me its always the BEST...

  • Active Members
  • PipPipPipPipPipPip
  • 1,329 posts

Posted 07 July 2012 - 10:15 AM

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

#5 PhoenixXL

PhoenixXL

    Be what you are, believe me its always the BEST...

  • Active Members
  • PipPipPipPipPipPip
  • 1,329 posts

Posted 07 July 2012 - 10:19 AM

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
AutoIt         
#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, 07 July 2012 - 10:21 AM.

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.

#6 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,356 posts

Posted 07 July 2012 - 10:49 AM

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: :(
AutoIt         
#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, 07 July 2012 - 11:05 AM.
Added code

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#7 PhoenixXL

PhoenixXL

    Be what you are, believe me its always the BEST...

  • Active Members
  • PipPipPipPipPipPip
  • 1,329 posts

Posted 07 July 2012 - 12:58 PM

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
AutoIt         
#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, 07 July 2012 - 01:04 PM.

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.

#8 therks

therks

    Witty quote

  • Active Members
  • PipPipPipPipPipPip
  • 2,163 posts

Posted 08 July 2012 - 12:38 AM

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, 08 July 2012 - 12:53 AM.


#9 rover

rover

    unmutual

  • Active Members
  • PipPipPipPipPipPip
  • 825 posts

Posted 08 July 2012 - 11:49 AM

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.
http://www.autoitscript.com/forum/topic/90309-why-the-huge-performance-hit/#entry663443


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




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users