michel_renard
Messages postés8Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention 8 octobre 2004
-
16 juin 2004 à 19:38
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 2006
-
20 juin 2004 à 13:55
trés débutant, je suis médecin et j'aimerais dans mon programme professionnel: repérér en arrière plan l'apparition d'une fenêtre fille (par son caption), répondre à la question qui est posée dans cette fenêtre et fermer la fenêtre qui a le focus.
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 16 juin 2004 à 20:46
Aie Aie, Aie
C peut être très simple, mais à condition que tu nous expliques un peu mieux.
Imagine un patient qui vient te dire "j'ai mal à la tête, de quoi suis-je atteint ?".
Donc, avant d'établir un diagnostic, il faudrait un peu plus de renseignements.
1 - Repérer en arrière plan ça veut dire une fenetre derrière une autre ? Par définition, si cette form est en arrière plan on ne la voit pas ou elle est en partie cachée par d'autres.
2 - Une fenetre fille de quoi de qui de quelle autres form ? En langage toubib de VB, ça voudrait peut-être dire une form affichée à partir d'une form MDI ?
3 - Pour ce qui est de fermer la form qui a le focus après réponse à la question, il suffit de coder me.unload à la fin du code du bouton de validation.
Quelques bouts de codes nous aideraient à t'aider.
Tout cela sans méchanceté, finalement tu soignes les corps et nous soignons les machines et les programmes.
michel_renard
Messages postés8Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention 8 octobre 2004 18 juin 2004 à 13:42
Je vais expliquer mes maux de tête. :-)
Dans mon programme médical, après avoir rempli mon ordonnance, je clique imprimer, j'ai un 1er message "imprimer en 1 ou 2 exemplaire?" je clique 2 à 99,5, je ferme la fenêtre et j'ai un deuxième message "faut-il enregistrer l'ordonnance dans le dossier" réponse oui à 100%.
J'avais déja créé un petit programme qui surveillait le clavier. Lors de la frappe d'un caractère de contrôle, il vérifiait que la fenêtre de l'ordonnance était bien ouverte puis via sendkey envoyait tous les caractères clavier pour répondre aux fenêtres. Le blème c'est que c'est pas très stable suivant les versions win.
Aussi je me suis dit qu'il me suffisait de vérifier régulièrement si ma fenêtre de message "imprimer en 1 ou 2 exemplaire?" est ouverte pour améliorer mon système.
Mon problème c'est que cette fenêtre ne fait pas partie des fenêtres parents, c'est une fenêtre fille, avec une particularité son caption est: "imprimer en 1 ou 2 exemplaire?".
Parmi toutes les fenêtres ouvertes à un moment donnée, comment détecter l'ouverture de celle-ci?.
Si j'utilise spyxx, il repère cette fenêtre.
c'est quoi le nom de l'api qui permet d'obtenir le caption des fenêtres filles?.
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 18 juin 2004 à 16:46
Salut,
G trouvé un truc mais pas pour les mdichild, g fais des essais et ça fonctionne.
Pour les mdichild, faudrait voir du côté de FindWindowEx et EnumChildWindows, si je peux je vais tester.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Sub Command1_Click()
Dim WinWnd As Long
' Chercher si la fenetre est chargée
WinWnd = FindWindow(vbNullString, "Calculatrice")
If WinWnd = 0 Then
MsgBox "Fenetre non trouvée."
Else
' Afficher la fenetre en premier plan
SetForegroundWindow WinWnd
End If
@+
End Sub
Cordialement
CanisLupus
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 18 juin 2004 à 17:44
Bon, résultat de mes tests :
Je ne sais pas si ça te conviendra mais voilà, bien sûr à la place d'afficher la fenetre trouvée, tu peux faire autre chose.
Dans une form :
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
Dim WinWnd As Long
' Chercher si la fenetre est chargée
WinWnd = FindWindow(vbNullString, CaptionDeTaMDI)
If WinWnd = 0 Then
MsgBox "MDI non trouvée."
Else
'test = False
EnumChildWindows WinWnd, AddressOf EnumChildProc, ByVal 0&
If test = False Then
MsgBox "Child non trouvée"
End If
End If
End Sub
Dans un module :
Public test As Boolean
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim sSave As String
' lecture de la longueur du caption
sSave = Space$(GetWindowTextLength(hwnd) + 1)
' Lecture du caption
GetWindowText hwnd, sSave, Len(sSave)
' on enlèle le Chr$(0) de fin de chaine
sSave = Left$(sSave, Len(sSave) - 1)
If sSave = CaptionDeTaChild Then
' Afficher la fenetre en premier plan
SetForegroundWindow hwnd
test = True
EnumChildProc = 0
Else
EnumChildProc = 1
End If
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 20 juin 2004 à 13:55
Si tu vas par là, tu peux même utiliser l'instruction SendKeys (en vb6) et tu peux même écrire un prog qui répondra à ta place aux questions barbantes de certains logiciels.
Publier un source, c beaucoup dire, tout juste un petit tuto en français.
Je t'expliques : ta question m'a interpellé et quand j'ai vu que je n'avais pas la soluce immédiate, ça m'a lancé un défi.
Donc, quelques recherches sur le web, décevantes pour la plupart quoique un ptit bout + un ptit bout..... ça aide à avoir une idée. Puis mélange de ces ptit bouts, tests, simplification, traduction et voilà, maintenant je maîtrise.
Mais de là à écrire un source complet, faudrait un projet.
De toutes, je garde ce truc dans mes cartons, ça peut resservir.