Comment patcher une fenêtre MDI

michel_renard Messages postés 8 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 8 octobre 2004 - 16 juin 2004 à 19:38
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 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.

Très simple pour vous, mais compliqué pour moi.

Merci de votre aide

Emer

9 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
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.

Cordialement

CanisLupus
0
michel_renard Messages postés 8 Date d'inscription mercredi 16 juin 2004 Statut Membre Derniè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?.

Cordialement

Emer
0
michel_renard Messages postés 8 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 8 octobre 2004
18 juin 2004 à 13:42
Emer
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
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

End Function

Bonne prog

Cordialement

CanisLupus
0
michel_renard Messages postés 8 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 8 octobre 2004
19 juin 2004 à 19:24
Mon cher canis

Le principe actif est effectivement le bon, merci

Il n'a a plus qu'a ajouter les aromates et les colorants :-)

En quelques lignes, il est donc possible de détecter une fenêtre de message spécifique, d'en shunter la réponse, ou de brancher un autre programme.

encore merci

cordialement

Emer
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
19 juin 2004 à 19:30
Heureux d'avoir pu te rendre service.

Cordialement

CanisLupus
0
michel_renard Messages postés 8 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 8 octobre 2004
20 juin 2004 à 12:23
P.S.

J'ai vu que tu as publié des sources.

J'ai vu également que d'autres ont posé ma question.

Je pense que tes qq lignes un peu plus commentées peuvent donner lieu à publication de source.

Des dizaines d'applications:
Je repère le message PASSWORD ou mot de passe, je branche sur un programme d'enregistrement qui va bien.

Je repère "faut-il enregistrer" d'un programme Office, je code le document et répond "oui".

Des tas d'améliorations de programme commerciaux, juste avec quelques lignes de VBA.

cordialement

Emer
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
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.

Cordialement

CanisLupus
0