Tester si une boite de dialogue est ouverte

Résolu
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 16 février 2011 - 8 juil. 2009 à 16:57
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre 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 ?

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2009 à 10:48
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
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 17:58
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
0
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 16 février 2011
8 juil. 2009 à 18:54
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2009 à 08:18
quelle déclaration d'API utilises tu ?

quel est ton code actuel ?


bref, il nous faut des détails pour être précis.
0

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

Posez votre question
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 16 février 2011
9 juil. 2009 à 09:52
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2009 à 09:59
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."
0
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 16 février 2011
9 juil. 2009 à 10:23
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)
0
thonyboy Messages postés 165 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 16 février 2011
9 juil. 2009 à 11:08
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
0
Rejoignez-nous