Module d'envoi de texte sur les salons aol + explications (toutes versions) (apis findwindow et sendmessage)

Contenu du snippet

Pour ceux qui veulent faire leur petit prog aol, j'essaye d'expliquer comment ça marche :]

Source / Exemple :


' Fonction Chatsend détaillée et commentée

Option Explicit

'-------------------------------------
' déclarations des APIs
'-------------------------------------

Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Function FindWindowEx& Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
Private Declare Function SendMessageString& Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String)
Private Declare Function SendMessageLong& Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long)

'-------------------------------------
' déclarations des constantes
'-------------------------------------

Private Const WM_SETTEXT = &HC
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_CHAR = &H102
Private Const VK_RETURN = &HD

Public Function ChatSend(ByVal Txt As String)

On Error Resume Next

Dim Room As Long, Rich As Long, Rich2 As Long, GetTrim As Long, Min As Single
Dim Aol As Long, MDI As Long, Child As Long, List As Long, Texte As String
Dim AOLIcon As Long, ZTxt As Long, TrimSpace As String, GetString As Long

Aol& = FindWindow("AOL Frame25", vbNullString) ' on récupère le handle de la fenêtre principale d'AOL
MDI& = FindWindowEx(Aol&, 0&, "MDIClient", vbNullString) ' puis celui de la MDI

'-------------------------------------
' recherche de la fenêtre du salon AOL
'-------------------------------------

    Child& = FindWindowEx(MDI&, 0&, "AOL Child", vbNullString) ' 1er AOL Child
    Rich& = FindWindowEx(Child&, 0&, "RICHCNTL", vbNullString) ' on cherche le handle de "RICHCNTL" sur le 1er AOL Child
    List& = FindWindowEx(Child&, 0&, "_AOL_Listbox", vbNullString) ' idem pour une "_AOL_Listbox"
    AOLIcon& = FindWindowEx(Child&, 0&, "_AOL_Icon", vbNullString) ' puis pour une "_AOL_Icon"
    ZTxt& = FindWindowEx(Child&, 0&, "_AOL_Static", vbNullString) ' enfin une zone "_AOL_Static"

If Rich& <> 0& And List& <> 0& And AOLIcon& <> 0& And ZTxt& <> 0& Then ' si tous les éléments sont présents sur le AOL Child

    Room& = Child& ' on a trouvé la fenêtre du salon et on place son handle dans la variable Room&

Else 'sinon

    Do
        Child& = FindWindowEx(MDI&, Child&, "AOL Child", vbNullString) ' on refait la même chose avec le AOL Child suivant (FindWindowEx(MDI&,Child& <- là on signale qu'on prend la suivante)
        Rich& = FindWindowEx(Child&, 0&, "RICHCNTL", vbNullString)
        List& = FindWindowEx(Child&, 0&, "_AOL_Listbox", vbNullString)
        AOLIcon& = FindWindowEx(Child&, 0&, "_AOL_icon", vbNullString)
        ZTxt& = FindWindowEx(Child&, 0&, "_AOL_static", vbNullString)

        If Rich& <> 0& And List& <> 0& And AOLIcon& <> 0& And ZTxt& <> 0& Then ' si tous les éléments sont trouvés

            Room& = Child& ' alors on place le handle dans la variable Room&
            
        End If
        
    Loop Until Child& = 0& ' on continue tant que l'on est pas arrivé au dernier AOL Child (plus d'AOL Child renvoie 0&)

End If

If Room& = 0& Then Exit Function 'si on a pas trouvé la fenêtre du salon alors on termine la fonction

'-------------------------------------
' recherche de la zone de texte
'-------------------------------------

Rich& = FindWindowEx(Room&, 0&, "RICHCNTL", vbNullString) ' on prend la 1ère "RICHCNTL" (-> richtextbox AOL) qui correspond à la zone de saisie sur AOL7
Rich2& = FindWindowEx(Room&, Rich&, "RICHCNTL", vbNullString) ' on prend la suivante qui correspond à la zone de saisie sur les autres versions d'AOL

If Rich2& = 0 Then Rich2& = Rich& ' si la "RICHCNTL" 2 renvoie 0 on est donc sur AOL7, on va envoyer les messages sur la 1ère "RICHCNTL"

'-------------------------------------
' récupération du texte de la zone de saisie
'-------------------------------------

GetTrim& = SendMessageLong(Rich2&, WM_GETTEXTLENGTH, 0&, 0&) ' on utilise un SendMessageLong avec la constante WM_GETTEXTLENGTH qui va renvoyer la longueur du texte et placer le résultat dans GetTrim&
TrimSpace$ = Space$(GetTrim&) ' on crée l'espace mémoire nécéssaire au stockage du texte dans TrimSpace$ (->taille de GetTrim&)
GetString& = SendMessageString(Rich2&, WM_GETTEXT, GetTrim + 500, TrimSpace$)
Texte$ = TrimSpace$ ' on place le texte récupéré dans la variable Texte$

'-------------------------------------
' vérification de la présence de texte dans la zone de saisie
'-------------------------------------

Do
    GetTrim& = SendMessageLong(Rich2&, WM_GETTEXTLENGTH, 0&, 0&) ' on récupère le texte de la zone de saisie
    TrimSpace$ = Space$(GetTrim)
    GetString& = SendMessageString(Rich2&, WM_GETTEXT, GetTrim + 500, TrimSpace$)
    Texte$ = TrimSpace$
    DoEvents ' on passe la main au système (pour éviter de bloquer les ressources pendant la boucle)
    
Loop Until Texte$ = "" ' on attend tant que la zone de saisie contient du texte

Min = Timer ' on utilise le mot clé Timer pour marquer une courte pause avant d'envoyer le texte
Do Until 0.7 <= Timer - Min
DoEvents
Loop

Call SendMessageString(Rich2&, WM_SETTEXT, 0&, Left(Txt$, 232)) ' on positionne les 232 premiers caractères à envoyer dans la zone de saisie
Call SendMessageLong(Rich2&, WM_CHAR, VK_RETURN, 0&) ' on simule l'appui de la touche ENTREE

If Len(Txt$) > 232 Then Call ChatSend(Right(Txt$, Len(Txt$) - 232)) ' si le texte a envoyer fait plus de 232 caractères on recommence avec la suite du texte

End Function

A voir également

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.