je souhaite piloter une application "exe" par l'intermédaire de VBA. C'est une application graphique créé sous fortran.
Mon but dans un premier temsp est de remplir la ligne indiquant le nom du fichier.
J'ai fait qq recherche et je suis parti sur ce bout de code:
public hGene as Long
Sub main
<...>
idProg = ShellExecute(test, "open", Chemin_du_programme, ThisWorkbook.path, 1)
hGene = FindWindow(vbNullString, Nom_de_la_fenetre)
EnumChildWindows hGene, AddressOf EnumChildProc, ByVal 0&
<...>
end sub
Function EnumChildProc(ByVal le_handle_fenetre As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinClassBuf As String * 255
Dim WinClass As String
RetVal = GetClassName(le_handle_fenetre, WinClassBuf, 255)
WinClass = nettoyage(WinClassBuf)
If WinClass = "Edit" Then
ID = GetDlgCtrlID(le_handle_fenetre)
Text= "test chaine de cractère" & vbnullstring
RetValBool = SetDlgItemText(hGene, ID, Text)
End If
EnumChildProc = True
End Function
Public Function nettoyage(chaine As String) As String
nettoyage = chaine
If (InStr(chaine, chr(0)) > 0) Then
nettoyage = Left(chaine, InStr(chaine, chr(0)) - 1)
End If
If Left(nettoyage, 7) = "Thunder" Then
nettoyage = Mid(nettoyage, 8)
End If
End Function
Je cherche à rentrer la chaine de caractère pour la première Class "Edit" rencontrée dans mon application. La façon dont j'utilise la fonction SetDlgItem ne semble pas être correcte.
Est-ce que l'un d'entre vous peut m'apporter son aide?
Perso, j'utiliserai plutôt SendMessageText, exemple :
If LCase(WinClass) = "edit" Then
sTemp = StrConv(sText, vbFromUnicode, ByVal 1033)
Call SendMessage(le_handle_fenetre, WM_SETTEXT, ByVal 0&, ByVal StrPtr(sTemp))
End If
Perso, j'ai ajouté la conversion Unicode, mais tu n'en n'aura peut-être pas besoin (1033 = CodePage US dans mon cas, 1036 pour le FR mais facultatif si même langue que l'OS - voir ce lien).
NB : Variable Text : Mauvais choix car peut ressembler aux mots clé du langage
--> sText
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
J'ai qq questions:
- tu parles de SendMessageText, mais ton exemple utilise SendMessage, est-ce une coquille?
- je ne trouve pas la fonction sendmessageText dans le fichier win32.hlp qui liste, il me semble, toutes les fonctions dispos.
- je ne sais pas comment utiliser la variable WM_SETTEXT. Est-ce qu'à l'instar de la variable WM_LBUTTONDOWN, il faut la déclarer en en-tête et lui donner une valeur:
Private Const WM_LBUTTONDOWN As Long = &H201
Effecitvement la variable Text n'est pas appropriée.
Je vais essayer de me débrouiller avec les infos que tu viens de me donner.
avec ce que tu m'as dit, j'ai modifié la fonction EnumChildProc comme suit:
Private Const WM_SETTEXT As Long = &HC&
Function EnumChildProc(ByVal le_handle_fenetre As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinClassBuf As String * 255, WinTitleBuf As String * 255
RetVal = GetClassName(le_handle_fenetre, WinClassBuf, 255)
WinClass = nettoyage(WinClassBuf)
If WinClass = "Edit" Then
sText = "essai"
sTemp = StrConv(sText, vbFromUnicode)
bTest = SendMessage(le_handle_fenetre, WM_SETTEXT, ByVal 0&, ByVal StrPtr(sTemp))
End If
EnumChildProc = True
End Function
A l'exécution de la ligne SendMessage, la variable btest est fausse et uun examen de la variable Err indique qu'elle vaut 1400 ce qui signifie "ERROR_INVALID_WINDOW_HANDLE". Le Handle que j'indique est le handle de mon objedt Edit. L'erreur est la même si j'indique le handle de la fenêtre du programme que je cherche à commander.
Je patauge.
Pour info, je n'ai qu'un accès limité à Internet et ne suis pas en mesure de consulter toutes les pages que google me rend en résultat de mes recherche. C'est peut-être pourquoi les questions que je pose demandent des réponses simples.
WM_SETTEXT = constante que tu trouveras dans <ce programme> qui les liste (presque) toutes.
Idem pour les APIs, je te conseille <cet autre programme> ultra pratique pour rechercher les APIs et trouver des exemples en VB6.
Quant à ton erreur, je ne vois pas trop pourquoi il te renvoie cela.
N'oublie pas de dimensionner tes variables, surtout quand on utilise les APIs et fonctions annexes comme StrPtr
Vous n’avez pas trouvé la réponse que vous recherchez ?
je ne poitnais pas vers le bon handle, d'où l'erreur.
Tout fonctionne comme je le souhaite désormais en dehors d'un pb de mise à jour des champs:
en exécution pas à pas tout fonctionne, mais en lançant la proc sans le débogueur j'ai plein de soucis. J'ai dû mettre des wait un peu partour. C'est pas le top mais c'est toujours ça.