Cours de pilotage........d'applications

Description

Je pilote souvent, pour le boulot un certain nombre d'applications externes.

J'utilises même un logiciel - Isis Papyrus Designer - que je modifie assez profondément :
- agrandissement des fenetres
- redisposition de controles
- changement de raccourcis clavier (menus)
- intégration d'une richtextbox VB dans la fenetre du programme
- etc.

Voilà donc pourquoi je vous propose aujourd'hui un petit cours de pilotage.

Je vois (trop) souvent des gens utiliser des SendKeys, kbd_event ou mouse_event pour piloter une application tierce.

c'est bien peu fiable, en fait.

Source / Exemple :


' Pilotage de la calculatrice Windows 
' on passe en mode scientifique
' on saisi un nombre
' on le convertit en hexa
' on récupère le résultat
' on ferme la calculatrice

Option Explicit

Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetDlgItem Lib "user32.dll" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function SendDlgItemMessage Lib "user32.dll" Alias "SendDlgItemMessageA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_CLOSE As Long = &H10
Private Const WM_COMMAND As Long = &H111
Private Const WM_DESTROY As Long = &H2
Private Const WM_GETTEXT As Long = &HD

Private mhFoundWnd As Long

Private Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim nPID As Long
    '# Permet de récuperer dans nPID le Process ID du process à qui appartient la fenetre
    '# dont le handle hWnd est passé en paramètre.
    GetWindowThreadProcessId hwnd, nPID
    '# Si le process id est celui que l'on cherche
    If lParam = nPID Then
        '# On stocke le handle de la fenêtre
        mhFoundWnd = hwnd
    Else
        '# Sinon, on poursuit la recherche
        EnumWindowsProc = True
    End If
End Function

'# Fonction permettant de retrouver le handle de la fenetre principale d'un process en utilisant son process id.
Private Function GetWndFromProcessID(ByVal vnPID As Long) As Long
    EnumWindows AddressOf EnumWindowsProc, vnPID
    GetWndFromProcessID = mhFoundWnd
End Function

Private Sub Main()
Dim hMainWnd As Long
Dim sBuffer As String
Dim nLength As Long
    hMainWnd = GetWndFromProcessID(Shell("calc"))
    If hMainWnd = 0 Then
        MsgBox "Fenêtre non trouvée", vbExclamation
    Else
        '# Activation du mode scientifique
        SendMessage hMainWnd, WM_COMMAND, 304, ByVal 0&
        
        '# Saisie du nombre 1983
        SendMessage hMainWnd, WM_COMMAND, 1 + 124, ByVal 0&
        SendMessage hMainWnd, WM_COMMAND, 9 + 124, ByVal 0&
        SendMessage hMainWnd, WM_COMMAND, 8 + 124, ByVal 0&
        SendMessage hMainWnd, WM_COMMAND, 3 + 124, ByVal 0&
        
        '# passage en mode hexa
        SendMessage hMainWnd, WM_COMMAND, 306, ByVal 0&
        
        '# récupération du texte du résultat.
        sBuffer = Space$(20)
        nLength = SendDlgItemMessage(hMainWnd, 403, WM_GETTEXT, 20, ByVal sBuffer)
        
        '# On ferme la calculatrice
        SendMessage hMainWnd, WM_CLOSE, 0, ByVal 0&

        '# On affiche le résultat
        If nLength Then
            sBuffer = Left$(sBuffer, nLength - 1)
            MsgBox "La valeur décimale 1983 s'écrit " & sBuffer & " en hexadécimal."
        Else
            MsgBox "Résultat non récupéré.", vbExclamation
        End If
    End If
End Sub

Conclusion :


Bonne lecture (doc word 2003)

Codes Sources

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.