Emmanuel93170
XLDnaute Nouveau
Bonjour à tous,
A) Via sendkeys, ma macro ouvre une nouvelle fenêtre SAP. A partir du moment où cette nouvelle fenêtre est ouverte, la suite des sendkeys ne lui parvient pas. J’ai donc trouvé une astuce consistant à faire apparaitre pendant une seconde un USF avant de reprendre les sendkeys qui, du coup, arrivent vers cette nouvelle fenêtre. A la fin, pour qu’Excel soit de nouveau la fenêtre active, j’utilise Application.ThisWorkbook.Activate. Grace à cela la fenêtre d’Excel semble active, elle réagit au passage de la souris (comme la fenêtre SAP : jamais vu deux fenêtres actives en même temps avant ça) mais c’est la fenêtre SAP qui reçoit les raccourcis clavier alors que je voudrais que ce soit Excel.
m_hWnd = FindWindow(vbNullString, ActiveWorkbook.Name )
Call SetForegroundWindow(m_hWnd)
(Avec les déclarations qui vont bien) ne fonctionne pas du tout
En sendkeys : Garder alt pressée et presser deux fois tab ferait l’affaire (Excel étant l’avant dernière fenêtre active) mais je ne sais pas faire ça.
SendKeys "{TAB}2", True
Donne deux fois alt + tab ce qui n’est pas idem.
B) D’autre part je ne trouve aucune solution pour passer en plein écran la fenêtre SAP que j’ai ouverte. Il n’existe pas de sendkey pour la touche Windows que j’aurais associé à la flèche vers le haut. On peut tout au mieux faire apparaitre le menu Windows avec cette Sendkeys (RAV)…
C) Enfin j’ai besoin que, à certains moments, la macro passe la fenêtre SAP au premier plan. Chose que je sais faire à partir de son handle mais je ne peux pas connaitre ce handle par son caption car il est différent pour chaque fenêtre SAP que la macro ouvre et il m’est impossible d’en connaitre les noms à l’avance.
Pour l'instant, la solution que j'ai trouvée n'est pas élégante : l'USF suivant. Il faut cliquer dessus et relâcher le clique sur le nouvelle fenêtre ouverte pour que la macro connaissent son handle.
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
MsgBox "cette fenêtre a pour handle : " & WindowFromPoint(Pt.X, Pt.Y)
End Sub
Il me semble que tous serait résolu si je trouvais comment :
Manu
A) Via sendkeys, ma macro ouvre une nouvelle fenêtre SAP. A partir du moment où cette nouvelle fenêtre est ouverte, la suite des sendkeys ne lui parvient pas. J’ai donc trouvé une astuce consistant à faire apparaitre pendant une seconde un USF avant de reprendre les sendkeys qui, du coup, arrivent vers cette nouvelle fenêtre. A la fin, pour qu’Excel soit de nouveau la fenêtre active, j’utilise Application.ThisWorkbook.Activate. Grace à cela la fenêtre d’Excel semble active, elle réagit au passage de la souris (comme la fenêtre SAP : jamais vu deux fenêtres actives en même temps avant ça) mais c’est la fenêtre SAP qui reçoit les raccourcis clavier alors que je voudrais que ce soit Excel.
m_hWnd = FindWindow(vbNullString, ActiveWorkbook.Name )
Call SetForegroundWindow(m_hWnd)
(Avec les déclarations qui vont bien) ne fonctionne pas du tout
En sendkeys : Garder alt pressée et presser deux fois tab ferait l’affaire (Excel étant l’avant dernière fenêtre active) mais je ne sais pas faire ça.
SendKeys "{TAB}2", True
Donne deux fois alt + tab ce qui n’est pas idem.
B) D’autre part je ne trouve aucune solution pour passer en plein écran la fenêtre SAP que j’ai ouverte. Il n’existe pas de sendkey pour la touche Windows que j’aurais associé à la flèche vers le haut. On peut tout au mieux faire apparaitre le menu Windows avec cette Sendkeys (RAV)…
C) Enfin j’ai besoin que, à certains moments, la macro passe la fenêtre SAP au premier plan. Chose que je sais faire à partir de son handle mais je ne peux pas connaitre ce handle par son caption car il est différent pour chaque fenêtre SAP que la macro ouvre et il m’est impossible d’en connaitre les noms à l’avance.
Pour l'instant, la solution que j'ai trouvée n'est pas élégante : l'USF suivant. Il faut cliquer dessus et relâcher le clique sur le nouvelle fenêtre ouverte pour que la macro connaissent son handle.
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
MsgBox "cette fenêtre a pour handle : " & WindowFromPoint(Pt.X, Pt.Y)
End Sub
Il me semble que tous serait résolu si je trouvais comment :
- Connaitre le handle de la dernière fenêtre ouverte
- Agrandir une fenêtre à partir de son handle
- Passer ActiveWorkbook « totalement » au premier plan quel que soit le contexte
Manu
Dernière édition: