Modification class "Edit" application tierce [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011
-
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011
-
Bonjour,

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?

Je le remercie d'avance

V.

6 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Salut

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)
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011

Bonjour,

et merci pour la réponse.

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.

A+
V.
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011

Re,

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.

Merci.
V.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
SendMessageText : Oui, coquille.

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
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011

Bonjour

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.

Merci de ton aide.
V.
Messages postés
5
Date d'inscription
jeudi 21 décembre 2000
Statut
Membre
Dernière intervention
29 août 2011

Pardon,

l'erreur venait la déclaration de WM_SETTEXT:
Private Const WM_SETTEXT As Long = &HC

est correct