7,763
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Public Const EN_SETFOCUS = &H100
Public Const EM_SETSEL = &HB1
Public Const WM_COMMAND = &H111
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public oldproc As Long
Public Function myWndproc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_COMMAND Then
Dim code As Long
code = (wParam And &HFFFF0000) / &H10000
'响应TextBox发送给父窗口的 EN_SETFOCUS
If code = EN_SETFOCUS Then
'这里不直接发送EM_SETSEL,原因是控件通过鼠标获得焦点会把选择取消(tab切换的没问题)
'所以转过弯,通过form1.focusTextBox来处理
Form1.setfocustextboxfromhwnd lParam
' SendMessage lParam, EM_SETSEL, 0, -1
End If
End If
myWndproc = CallWindowProc(oldproc, hwnd, uMsg, wParam, lParam)
End Function
Public Sub hook(hwnd As Long)
oldproc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf myWndproc)
End Sub
Public Sub unhook(hwnd As Long)
SetWindowLong hwnd, GWL_WNDPROC, oldproc
End Sub
Option Explicit
Private WithEvents focusTextBox As TextBox '具有焦点的TextBox的引用,响应TextBox的事件
Private Sub focusTextBox_GotFocus()
SendMessage focusTextBox.hwnd, EM_SETSEL, 0, -1
End Sub
Public Function setfocustextboxfromhwnd(hwnd As Long)
'找出具有焦点的TextBox,交由focusTextBox处理事件
Dim obj As Object
For Each obj In Me.Controls
If TypeName(obj) = "TextBox" Then
If obj.hwnd = hwnd Then
Set focusTextBox = obj
End If
End If
Next
End Function
Private Sub Form_Load()
hook Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
unhook Me.hwnd
End Sub
'窗体中需要一个定时器,周期设置为50ms.
Option Explicit
Private Declare Function GetFocus Lib "user32.dll" () As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
Private Const EM_SETSEL As Long = &HB1
Private Sub Timer1_Timer()
Static lastWnd As Long '上一次的句柄
Dim curWnd As Long '本次获取的句柄
curWnd = GetFocus '获取当前拥有焦点的控件的句柄
If curWnd = lastWnd Then Exit Sub '如果与上次的句柄相同,则退出,避免干扰用户输入
lastWnd = curWnd '如果执行到了这里,说明句柄不同了,则保存新的句柄
Call SendMessage(lastWnd, EM_SETSEL, 0, ByVal -1) '再向新的句柄发送全选消息
End Sub