Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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."
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 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)
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 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