Focus dans un MsgBox

thilam

XLDnaute Junior
Bonjour à tous,
j'ai une icone dans la barre d'outil qui déclenche une macro se terminant par l'affichage d'un MsgBox. Je voudrais que le pointeur de souris se positionne sur le bouton OK du MsgBox (il reste sur l'icone de la barre d'outils). A priori on ne peut pas utiliser setfocus puisque l'objet MsgBox n'est pas identifié (en tout cas je ne sais pas comment).
Je précise que le positionnement automatique du pointeur est activé au niveau du gestionnaire de souris et que ça fonctionne.
L'un de vous a-t-il une solution?
Merci
Th
 

mécano41

XLDnaute Accro
Re : Focus dans un MsgBox

Bonjour,

Je ne comprends pas... Je viens de le faire.... Si j'ai un bouton de barre d'outils qui me lance un code dans lequel j'ai un MsgBox ; lorsque ce MsgBox est affiché, le focus est déjà sur le bouton OK (même si l'on ne voit pas le curseur) puisque si j'appuie sur Entrée, je sors de ce MsgBox...

Cordialement
 

thilam

XLDnaute Junior
Re : Focus dans un MsgBox

Ok, je vois ce que tu veux dire. Ce que je voudrais c'est pouvoir faire un click gauche sans devoir déplacer la souris. Plus que le focus, c'est le pointeur de la souris que j'aimerais positionner sur le bouton OK. C'est du détail mais ça m'intéresse de savoir si c'est possible.
 

PMO2

XLDnaute Accro
Re : Focus dans un MsgBox

Bonjour,

Une solution avec les 2 codes suivants

1) Premier code à copier dans un module standard (CE CODE N'A PAS A ETRE ADAPTE on le laisse tel quel)
Code:
Private Declare Function FindWindow& Lib "user32" _
  Alias "FindWindowA" (ByVal lpClassName As String, _
  ByVal lpWindowName As String)
Private Declare Function SetTimer& Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long, _
  ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" _
  (ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Declare Function GetWindowText& Lib "user32" _
  Alias "GetWindowTextA" _
  (ByVal hwnd As Long, ByVal lpString As String, _
   ByVal cch As Long)
Private Declare Function GetWindowRect& Lib "user32" _
  (ByVal hwnd As Long, lpRect As RECT)
Private Declare Function SetCursorPos& Lib "user32" _
  (ByVal x As Long, ByVal y As Long)

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private OnTimer As Long
Private DECALH As Long
Private DECALV As Long
Private TITRE_MSGBOX As String
  
'___________________________
Private Sub API_PointeurSourisMsgBox()
Dim HwndMsgBox&
HwndMsgBox& = FindWindow(vbNullString, TITRE_MSGBOX)
Dim Ch$
Dim Tampon&
Dim reponse&
Dim R As RECT
Ch$ = Space(1024)
Tampon& = Len(Ch$)
reponse& = GetWindowText(HwndMsgBox&, Ch$, Tampon&)
Ch$ = Trim(Replace(Ch$, Chr$(0), ""))
If Ch$ = TITRE_MSGBOX Then
  reponse& = GetWindowRect(HwndMsgBox&, R)
  reponse& = SetCursorPos(((R.Left + R.Right) / 2) + DECALH, ((R.Top + R.Bottom) / 2) + DECALV)
  Call OffTimer
End If
End Sub
'___________________________
Public Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf API_PointeurSourisMsgBox)
End Sub
'___________________________
Private Sub OffTimer()
If OnTimer& > 0 Then
  OnTimer& = KillTimer(0&, OnTimer&)
  OnTimer& = 0
End If
End Sub
'___________________________
Public Sub PointeurSourisMsgBox(TitreMsgBox As String, DecalageH As Long, DecalageV As Long)
TITRE_MSGBOX = TitreMsgBox
DECALH = DecalageH
DECALV = DecalageV
OnTimer& = 0
Call RunTimer(Delai:=0)
End Sub

2) Deuxième code (qu'il faudra adapter) à copier dans un autre module standard
Code:
'####################################################################################
'###  Pointeur de la souris sur le bouton OK - Un exemple avec 3 MsgBox           ###
'###              La Sub "PointeurSourisMsgBox" a 3 arguments                     ###
### 1) TitreMsgBox - le titre de la MsgBox (par défaut "Microsoft Excel")        ###
'### 2) DecalageH - décalage horizontal pour bien situer le pointeur de la souris ###
'### 3) DecalageV - décalage horizontal pour bien situer le pointeur de la souris ###
'####################################################################################

'___________________________
Sub test_pmo()
  '*** Votre traitement ***
  
'///// à ajouter avant la 1ère MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Microsoft Excel", DecalageH:=0, DecalageV:=28)
MsgBox "Bonjour"
'/////////////////////////////////////////

  '*** Suite de votre traitement ***
  
'///// à ajouter avant la 2ème MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Test      ''PointeurSourisMsgBox''", DecalageH:=0, DecalageV:=45)
MsgBox prompt:="Ceci est un essai pour illustrer ''PointeurSourisMsgBox''" & vbCrLf & vbCrLf & _
               "Le pointeur de la souris doit se trouver sur le bouton OK." & vbCrLf & vbCrLf, _
       Title:="Test      ''PointeurSourisMsgBox''"
'/////////////////////////////////////////

  '*** Suite de votre traitement ***
  
'///// à ajouter avant la 3ème MsgBox ////
Call PointeurSourisMsgBox( _
    TitreMsgBox:="Dernier test ''PointeurSourisMsgBox''", DecalageH:=-85, DecalageV:=69)
MsgBox prompt:="Un dernier essai." & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & _
               "Le pointeur de la souris doit se trouver sur le bouton OUI." & vbCrLf & vbCrLf, _
       Title:="Dernier test ''PointeurSourisMsgBox''", _
       Buttons:=vbYesNoCancel + vbCritical
'/////////////////////////////////////////

End Sub

Ce dernier code n'est qu'un exemple pour illustrer.
Pour votre usage, il suffit de mettre, avant chaque MsgBox de votre programme, la ligne de code suivante
Call PointeurSourisMsgBox(TitreMsgBox:="toto", DecalageH:=-85, DecalageV:=69)
en adaptant TitreMsgBox avec le titre de la MsgBox (par défaut : "Microsoft Excel") puis en faisant tourner
votre programme afin de peaufiner les paramètres DecalageH et DecalageV, qui acceptent des entiers positifs ou négatifs,
pour que le pointeur de la souris soit bien à l'endroit désiré (voir l'exemple en pièce jointe).

Pour faire un essai, lancez la macro test_pmo. Bon courage.

Cordialement.

PMO
Patrick Morange
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 595
Messages
2 090 094
Membres
104 374
dernier inscrit
cheick.coulibaly@dcsmali.