Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment détecter l'ouverture d'une fenêtre popup par une appli windows ?

3 réponses
Avatar
teddy
Bonjour,

Je cherche comment détecter l'ouverture d'une fenêtre popup d'une application
Windows quelconque afin de pouvoir y répondre avec des SendKeys().
Je sais détecter qu'il existe une instance de cette application ( avec Set
MyAppli = GetObject(, ClassApplication) ) mais je ne vois pas comment ensuite
lui passer des commandes avec des SendKeys() pour répondre à cette application.
Quel rôle AppActivate joue dans tout cela ?

Auriez-vous une idée ?

Ted

3 réponses

Avatar
ANDBRETON
le sendkeys de vb fera effet sur la fenetre en premier plan sur ton
windows (fenetre active)
d'ou le
appactivate "titre de la fenetre de l'appli ou envoyer le sendkeys"

dans le code suivant je met l'appli "XXXX' en fenetre active.
j'ouvre le menu par alt-a puis une fenetre par alt-v
j'y colle une référence (precedemment recuperée) dans une zone de tex te
par un control-c
si cette référence référence n'existe pas, l'appli ouvre une fenetre
pop up qui a pour titre "Attention"
ce pop up m'empeche de continuer mon traitement et je dois la fermer.

ceci est fait par la fonction EnumWindows qui verifie systematiquement
si il y a une fenetre "attention" activée. Si oui je la ferme.

j'espere que tu pourras t'en inspirer :
-voir les API du module
-ne pas oublier les sleep pour laisser le temps à l'appli de réagir..

AppActivate "XXXX"
Sleep 200

SendKeys "^A", True
Sleep 200
SendKeys "^V", True
Sleep 200

SendKeys "%C", True
Sleep 3000

'ferme Attention si elle existe
flgNODL = False
RetVal = EnumWindows(AddressOf MyEnumWinCallback, 0)
If flgNODL Then
.....
else
....
End If
DoEvents


un module

Option Explicit
Public flgNODL As Boolean

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal
cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As
Long, ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Public Const WM_CLOSE As Long = &H10
Public Function MyEnumWinCallback(ByVal hWndX As Long, lParam As Long)
As Long
Dim CurTitleText As String
Dim RetVal As Long
Dim sTitle As String
Dim hwnd As Long
CurTitleText = Space$(80)
RetVal = GetWindowText(hWndX, CurTitleText, 80)
If InStr(CurTitleText, "Attention") <> 0 Then
sTitle = "Attention"
hwnd = FindWindow(vbNullString, sTitle)
Call SendMessage(hwnd, WM_CLOSE, 0, ByVal 0&)
flgNODL = True
End If
MyEnumWinCallback = True

CurTitleText = vbNullString
sTitle = vbNullString
End Function


Bon courrage
Avatar
Gloops
Salut,

A propos il y a quelques semaines (ou mois ?) j'avais essayé de
communiquer avec une fenêtre par SendMessage plutôt que SendKeys, et
j'avais fait chou blanc. Pourtant, j'avais l'impression d'avoir bien
fait tout comme c'était expliqué, avec KEY_DOWN d'abord et KEY_UP
ensuite, en déclarant bien les constantes en tête et tout ...

Avec SetActiveWindow et SendKeys ça fonctionnait, à condition évidemment
que l'utilisateur enlève ses papattes du clavier et de la souris -d'où
l'intérêt de SendMessage.

Est-ce qu'il y a un piège classique, ou est-ce qu'il faut que je balance
tout le code ?
________________________________________
ANDBRETON a écrit, le 14/09/2005 14:38 :

le sendkeys de vb fera effet sur la fenetre en premier plan sur ton
windows (fenetre active)
d'ou le
appactivate "titre de la fenetre de l'appli ou envoyer le sendkeys"

dans le code suivant je met l'appli "XXXX' en fenetre active.
j'ouvre le menu par alt-a puis une fenetre par alt-v
j'y colle une r?f?rence (precedemment recuper?e) dans une zone de texte
par un control-c
si cette r?f?rence r?f?rence n'existe pas, l'appli ouvre une fenetre
pop up qui a pour titre "Attention"
ce pop up m'empeche de continuer mon traitement et je dois la fermer.

ceci est fait par la fonction EnumWindows qui verifie systematiquement
si il y a une fenetre "attention" activ?e. Si oui je la ferme.

j'espere que tu pourras t'en inspirer :
-voir les API du module
-ne pas oublier les sleep pour laisser le temps ? l'appli de r?agir..

AppActivate "XXXX"
Sleep 200

SendKeys "^A", True
Sleep 200
SendKeys "^V", True
Sleep 200

SendKeys "%C", True
Sleep 3000

'ferme Attention si elle existe
flgNODL = False
RetVal = EnumWindows(AddressOf MyEnumWinCallback, 0)
If flgNODL Then
.....
else
....
End If
DoEvents


un module

Option Explicit
Public flgNODL As Boolean

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal
cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As
Long, ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Public Const WM_CLOSE As Long = &H10
Public Function MyEnumWinCallback(ByVal hWndX As Long, lParam As Long)
As Long
Dim CurTitleText As String
Dim RetVal As Long
Dim sTitle As String
Dim hwnd As Long
CurTitleText = Space$(80)
RetVal = GetWindowText(hWndX, CurTitleText, 80)
If InStr(CurTitleText, "Attention") <> 0 Then
sTitle = "Attention"
hwnd = FindWindow(vbNullString, sTitle)
Call SendMessage(hwnd, WM_CLOSE, 0, ByVal 0&)
flgNODL = True
End If
MyEnumWinCallback = True

CurTitleText = vbNullString
sTitle = vbNullString
End Function


Bon courrage



Avatar
teddy
Merci beaucoup pour l'exemple.
Je vais m'en inspirer.
Dès que j'aurai testé, je posterai ici le résultat.

Ted


"ANDBRETON" a écrit dans le message de news:

le sendkeys de vb fera effet sur la fenetre en premier plan sur ton
windows (fenetre active)
d'ou le
appactivate "titre de la fenetre de l'appli ou envoyer le sendkeys"

dans le code suivant je met l'appli "XXXX' en fenetre active.
j'ouvre le menu par alt-a puis une fenetre par alt-v
j'y colle une rfrence (precedemment recupere) dans une zone de texte
par un control-c
si cette rfrence rfrence n'existe pas, l'appli ouvre une fenetre
pop up qui a pour titre "Attention"
ce pop up m'empeche de continuer mon traitement et je dois la fermer.

ceci est fait par la fonction EnumWindows qui verifie systematiquement
si il y a une fenetre "attention" active. Si oui je la ferme.

j'espere que tu pourras t'en inspirer :
-voir les API du module
-ne pas oublier les sleep pour laisser le temps l'appli de ragir..

AppActivate "XXXX"
Sleep 200

SendKeys "^A", True
Sleep 200
SendKeys "^V", True
Sleep 200

SendKeys "%C", True
Sleep 3000

'ferme Attention si elle existe
flgNODL = False
RetVal = EnumWindows(AddressOf MyEnumWinCallback, 0)
If flgNODL Then
.....
else
....
End If
DoEvents


un module

Option Explicit
Public flgNODL As Boolean

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindowText Lib "user32" Alias
"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal
cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As
Long, ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As
Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Public Const WM_CLOSE As Long = &H10
Public Function MyEnumWinCallback(ByVal hWndX As Long, lParam As Long)
As Long
Dim CurTitleText As String
Dim RetVal As Long
Dim sTitle As String
Dim hwnd As Long
CurTitleText = Space$(80)
RetVal = GetWindowText(hWndX, CurTitleText, 80)
If InStr(CurTitleText, "Attention") <> 0 Then
sTitle = "Attention"
hwnd = FindWindow(vbNullString, sTitle)
Call SendMessage(hwnd, WM_CLOSE, 0, ByVal 0&)
flgNODL = True
End If
MyEnumWinCallback = True

CurTitleText = vbNullString
sTitle = vbNullString
End Function


Bon courrage