Tester si une boite de dialogue est ouverte [Résolu]

thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 8 juil. 2009 à 16:57 - Dernière réponse : thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 9 juil. 2009 à 11:08
Bonjour

Est il possible en vb net de tester si une boite de dialogue d'un programme externe est ouverte ?

Je débute, et j'esperais m'en tirer avec findwindow mais je n'y arrive pas.
J'ai utilisé les spy++ afin d'avoir des infos sur cette boite de dialogue

Titre de la fenêtre : Règles du courrier électronique
Handle de la fenetre : 001f12e6
Proc. de la fenetre : 2FD8D804
etc etc

Est ce que quelqu'un peut m'aider ?
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2009 à 10:48
3
Merci
c'est pas supérieur que j'indique en montrant

Long => Integer

mais une fléche

dans la doc des APIs et dans bon nombre de sources les utilisant (en VB6), on utilise des Long (4 octets).

en .Net, il faut également une variable sur 4 octets et là, le Long ne convient plus et va faire planter notre appel.
Il faut donc convertir Long -> Integer dans les appels.

IntPtr n'est en gros qu'un Alias d'un Integer.
MainWindowHandle t'en renvoie un, du coup, faut mettre IntPtr dans les déclarations...
c'est nécessaire pour tout ce qui est hWnd.

Lancant Spy++ (j'ai pas trouvé où tu lance ce dialogue précis)
je remarque que les dialogues ne sont pas rattachés à Outlook, mais en Childs du bureau.

donc:

Public Class Form1
Private Declare Auto Function FindWindow Lib "user32" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hDialog As IntPtr
hDialog = FindWindow("#32770", "Enregistrer les règles exportées sous")
MsgBox("Le Hwnd du Dialogue est " & hDialog.ToString)
End Sub
End Class

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de Renfield
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 juil. 2009 à 17:58
0
Merci
quelle déclaration d'API utilises tu ?

te faut adapter ce que tu peux lire sur le Net, souvent ecrit pour VB

Long => Integer

par exemple
Commenter la réponse de Renfield
thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 8 juil. 2009 à 18:54
0
Merci
Justement je n'ai pas reussi c'est pour ca que je pose la question ici. Autant dire que ton message ne m'aide en roen.
Commenter la réponse de thonyboy
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2009 à 08:18
0
Merci
quelle déclaration d'API utilises tu ?

quel est ton code actuel ?


bref, il nous faut des détails pour être précis.
Commenter la réponse de Renfield
thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 9 juil. 2009 à 09:52
0
Merci
Voic mon code actuel



Public Class Form1



    Private Declare Function FindWindow Lib "user32" _
   Alias "FindWindowA" _
  (ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long



    Private Declare Auto Function FindWindowEx Lib "user32.dll" ( _
ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, _
ByVal lpszWindow As String _
) As Long



  
 



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fen
        Dim fils



        Dim Outlook() As System.Diagnostics.Process = Process.GetProcessesByName("Outlook")
        If Outlook.Length > 0 Then
            fen = Outlook(0).MainWindowHandle
            MsgBox("Le Hwnd de Outlook est " + fen.ToString)
            fils = FindWindowEx(fen, 0, "#32770", "Enregistrer les règles exportées sous")
            MsgBox("Le Hwnd de Outlook est " + fils.ToString)
        Else
            MsgBox("Outlook n'est pas lancé !")
       End If
   End Sub




Voila mon code actuel. C'est un peu leger mais je patauge completement ! Je trouve plein de chose sur VBFrance et autres sites mais impossible de l'appliquer.
Je n'y comprend rien !

Pour rappel j'ai besoin de savoir si cette boite de dialogue est ouverte ou non.

D'avance merci
Commenter la réponse de thonyboy
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2009 à 09:59
0
Merci
Comme je te le disai dans mon premier message...

Adapte tes déclarations d'API pour qu'elles fonctionnent en .NET

à savoir principalement Long => Integer

testes donc avec :

Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Integer

Private Declare Auto Function FindWindowEx Lib "user32.dll" ( _
ByVal hwndParent As Integer, _
ByVal hwndChildAfter As Integer, _
ByVal lpszClass As String, _
ByVal lpszWindow As String _
) As Integer


si cela fonctionne, je t'invite à reconsidérer ton "Autant dire que ton message ne m'aide en roen."
Commenter la réponse de Renfield
thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 9 juil. 2009 à 10:23
0
Merci
Bonjour Renfield

1/ Avec tes déclarations ca ne fonctionne pas mieux. désolé.

2/ J'ai toujours une erreur "La conversion du type 'IntPtr' en type 'Integer' n'est pas valide" sur la ligne :
fils = FindWindowEx(fen, 0, "#32770", "Enregistrer les règles exportées sous")

3/ Je suis désolé depuis hier tu me dis : Long => Integer
Je ne vois pas trés bien. Je sais bien qu'un long est supérieur a un interger.

4/ J'ai tendance a récupérer sur un site qui se dit spécialisé (www.pinvoke.net/) mais qui étrangement a tendance a déclarer des intprt un peu partout pour ces fonctions contrairement a d'autres qui mettent des longs

5/ Enfin désolé si mon commentaire ne t'as pas plus, je ne souhaitais pas être désagréable.
mais c'est vrai que je galère, que je n'avance plus a cause de cette xxx boite de dialogue. et que j'aimerais vraiment que quelqu'un me sorte de cette misère.

Je ne sais meme pas si mon code est correct... Je n'ai jamais utilisé ces fonctions, alors que toi tu semble etre un expert si j'en crois toutes tes intervention ici sur des posts comparables (oui j'ai cherché avant et je suis tombé sur pas mal de tes réponses)
Commenter la réponse de thonyboy
thonyboy
Messages postés
166
Date d'inscription
mercredi 23 avril 2003
Dernière intervention
16 février 2011
- 9 juil. 2009 à 11:08
0
Merci
Merci Renfield tant pour la solution que pour les explications.



Donc en fait, sur le site www.pinvoke.net les déclarations sont bonnes pour vb.net puisque souvent ils utilisent des intptr au lieu des longs.

Pourtant hier, sur un autre probleme auquel tu m'a répondu (émettre une appli en premier plan) le pb était inverse. Si je faisais mes déclarations avec intptr au lieu de long ca ne fonctionnait plus...

Alors je vais me repencher la dessus pour bien comprendre.

Et si j'ai bien compris, un long en vb6 faisait 4 octects et en vb net il en fait plus. Du coup on utilise intptr qui lui est sur 4 octects
Commenter la réponse de thonyboy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.