Bonjour,
Comment savoir réellement quand une Form perd ou retrouve son focus...
il faut intercepter le Message WM_ACTIVATE
Source / Exemple :
' PCPT [AFCK] 17 sept 2005
'
'module SubClassing appelant la procédure de la Form appelante au changement du Focus
'
Option Explicit
'
'
Private 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
'
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'
Private Const WM_ACTIVATE = &H6
Private Const GWL_WNDPROC = (-4)
'
Private Old_WindowProc As Long
'
Public Enum eFocus
LostFocus = 0
GetFocus
End Enum
'
'
'
Private Function New_WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_ACTIVATE Then
New_WindowProc = True
Call FORM_MAIN.ChangeControlsFocus(wParam)
Else
'laisse la procédure indemne pour les autres messages
New_WindowProc = CallWindowProc(Old_WindowProc, hwnd, Msg, wParam, lParam)
End If
End Function
'
'
Public Sub StartSubclassing(hwnd As Long)
Old_WindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf New_WindowProc)
End Sub
'
'
Public Sub StopSubclassing(hwnd As Long)
Dim lngRetVal As Long
lngRetVal = SetWindowLong(hwnd, GWL_WNDPROC, Old_WindowProc)
End Sub
Conclusion :
j'avais fait ce code juste pour certains de mes tests, mais comme je vois très souvent la question sur le forum, le voici à disposition ;)
espérant qu'il soit apprécié^^
++
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.