Публикация этого отдельного ответа, потому что он полностью отличается
. Вы можете использовать функцию SendMessage
WinAPI с константой EM_GETSEL
, чтобы получить выбор текущего активного элемента управления.
Объявления:
(поскольку мы не работаем со строками, не имеет значения, используете ли вы SendMessageA или SendMessageW, эти объявления предназначены только для VBA7)
Public Declare Function SendMessage Lib "User32.dll" Alias "SendMessageW" (ByVal hWnd As LongPtr, ByVal Msg As Integer, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Public Declare Function GetFocus Lib "User32.dll" () As LongPtr
Public Const EM_SETSEL As Integer = &HB1
Public Const EM_GETSEL As Integer = &HB0
Реализуйте это:
Public Sub GetSelection()
Dim StartSel As Long
Dim EndSel As Long
Dim hWnd As LongPtr
hWnd = GetFocus
SendMessage hWnd, EM_GETSEL, VarPtr(StartSel), VarPtr(EndSel)
Debug.Print StartSel
Debug.Print EndSel
End Sub
Это печатает выбор текущего активного элемента управления.
Я проверил это для текстовых полей свыделение 32768-го символа, результат совпадает с моим первым решением (StartSel = UIntToLong(Control.SelStart)
= True, и EndSel = UIntToLong(Control.SelStart + Control.SelLength)
также верно.
Я рекомендую другое решение по сравнению с этим решением WinAPI, так как этоиспользует текущий активный элемент управления и не выдает ошибку, если это неверно, использует внешние вызовы API и, вероятно, имеет немного больше накладных расходов.
Это решение имеет поддержку текстовых полей с более чем 2 ^ 16 символовНо в этом случае Access ведет себя странно, и я рекомендую не использовать встроенный элемент управления textbox для таких больших текстовых полей.