我想每当一个form重新获得焦点时(比如现在是IE游览器,再点这个form,form重新获得焦点),执行一断代码,如何实现?
我试了
Private Sub Form_Activate()这个只能在由不可见变为可见时起作用,
Private Sub Form_GotFocus()这个,如果form中有控件,就不起作用,
请问有没有别的方法呢?
...全文
1954打赏收藏
form重新获得焦点问题
我想每当一个form重新获得焦点时(比如现在是IE游览器,再点这个form,form重新获得焦点),执行一断代码,如何实现? 我试了 Private Sub Form_Activate()这个只能在由不可见变为可见时起作用, Private Sub Form_GotFocus()这个,如果form中有控件,就不起作用, 请问有没有别的方法呢?
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) 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 Const GWL_WNDPROC = (-4)
Public Const WM_KILLFOCUS = &H8
Public Const WM_SETFOCUS As Integer = &H7
Public PrevProc As Long, iCount As Integer
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = WM_SETFOCUS And iCount > 0 Then
Form1.Caption = Now '窗体激活执行此代码
End If
Debug.Print iCount
End Function
Private Sub Form_Load()
PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Resize()
iCount = iCount + 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, PrevProc
End Sub
又要提子类化了
窗体获得焦点时改变标题栏为当前时间。注意窗体名是Form1
添加一个模块,粘贴以下代码:
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) 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 Const GWL_WNDPROC = (-4)
Public Const WM_KILLFOCUS = &H8
Public Const WM_ACTIVATE = &H6
Public PrevProc As Long
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = WM_ACTIVATE And wParam = 2 Then
Form1.Caption = Now '窗体激活执行此代码
End If
End Function
窗体Form1的代码:
Private Sub Form_Load()
PrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, PrevProc
End Sub