RobertAlanGustafsonII
Active member
- Joined
 - Sep 16, 2023
 
- Messages
 - 42
 
- Programming Experience
 - 10+
 
WHAT I HAVE:
Visual Basic 2019, .NET Framework, WinForms
MY ISSUE:
I'd like to be able to programmatically figure out which end of a selection is the anchor and which is the active end when the user changes the selection of a TextBox or RichTextBox. The SelectionStart property is always the left end of a selection, and apparently EM_GETSEL always returns left/right, whereas EM_SETSEL sets anchor/active end. Left always comes before right, but the anchor can be after the active end. This matters if one has to temporarily change, then restore the selection programatically--as the user can thus find oneself extending the selection on the left, then suddenly contracting it on the right for no apparent reason!
The following StackOverflow page provided a supposed "kludge" fix in C++ and Delphi: "EM_GETSEL swaps parameters", but I haven't been able to successfully adapt the code there to VB.NET. The following code below always sets the Active end--and the caret (with no subsequent selection)--to the end of the full text:
	
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
I need a solution quickly. Please respond ASAP--and keep it in VB.NET (that goes without saying here), and as simple as possible.
	
		
			
		
		
	
				
			Visual Basic 2019, .NET Framework, WinForms
MY ISSUE:
I'd like to be able to programmatically figure out which end of a selection is the anchor and which is the active end when the user changes the selection of a TextBox or RichTextBox. The SelectionStart property is always the left end of a selection, and apparently EM_GETSEL always returns left/right, whereas EM_SETSEL sets anchor/active end. Left always comes before right, but the anchor can be after the active end. This matters if one has to temporarily change, then restore the selection programatically--as the user can thus find oneself extending the selection on the left, then suddenly contracting it on the right for no apparent reason!
The following StackOverflow page provided a supposed "kludge" fix in C++ and Delphi: "EM_GETSEL swaps parameters", but I haven't been able to successfully adapt the code there to VB.NET. The following code below always sets the Active end--and the caret (with no subsequent selection)--to the end of the full text:
			
				Anchor and active ends of selection:
			
		
		
		<DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
Public Shared Function SendMessage(hWnd As IntPtr, msg As Integer, ByRef wParam As Integer, _
        ByRef lParam As Integer) As IntPtr
End Function
Public Sub GetEnds(ByRef Anchor As Integer, ByRef Active As Integer)
        '   get anchor and active end of selection
        Const EM_GETSEL = &HB0, EM_SETSEL = &HB1
        Anchor = 0 : Active = 0
        Dim Start As Integer = 0, Finish As Integer = 0
        With TextBoxOrRichTextBox
            '    get ends of selection
            SendMessage(.Handle, EM_GETSEL, Start, Finish)
            '   temporarily kill selection to get active end
            SendMessage(.Handle, EM_SETSEL, -1, 0)
            SendMessage(.Handle, EM_GETSEL, Active, 0)
            '   restore selection and return values
            If Active = Start Then
                Anchor = Finish : SendMessage(.Handle, EM_SETSEL, Finish, Start)
             Else
                Anchor = Start : SendMessage(.Handle, EM_SETSEL, Start, Finish)
            End If
        End With
End Sub
	I need a solution quickly. Please respond ASAP--and keep it in VB.NET (that goes without saying here), and as simple as possible.
			
				Last edited: