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

Soyez le premier à donner votre avis sur cette source.

Vue 11 046 fois - Téléchargée 1 310 fois

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

Ajouter un commentaire

Commentaires

Messages postés
27
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Pourquoi ce code ne marche pas? (ni avec WORD,EXCEL alors que c'est ok avec NOTEPAD).Aucune erreur se produit, l'appli en question s'ouvre et passe au premier plan, puis c'est tout.
Merci pour une reponse

Private Sub Form_Click()

Dim h As Long, retval As Long, h2 As Long, h3 As Long
Dim posit As Long

retval = Shell("C:\Program Files\OpenOffice.org 3\program\swriter.exe", vbNormalNoFocus)
h = FindWindow("SALFRAME", "Sans nom 1 - OpenOffice.org Writer")

If preplan Then
lgConst = HWND_TOPMOST
Else
lgConst = HWND_NOTOPMOST
End If
posit = SetWindowPos(h, lgConst, 10, 10, 400, 400, &H100)

AppActivate "Sans nom 1 - OpenOffice.org Writer"

SetForegroundWindow (h)

' on active le premier element de la Barre de menus pour cela on simule "Alt"
PostMessage h, WM_KEYDOWN, VK_MENU, 0
PostMessage h, WM_KEYUP, VK_MENU, 0
' on simule la fleche vers la droite pour se deplacer dans le menu
PostMessage h, WM_KEYDOWN, VK_RIGHT, 0 'touche enfoncee
PostMessage h, WM_KEYUP, VK_RIGHT, 0 'touche relevee

'on simule la fleche vers le bas pour derouler le menu selectionne
PostMessage h, WM_KEYDOWN, VK_DOWN, 0
PostMessage h, WM_KEYUP, VK_DOWN, 0

'on simule la touche entree pour afficher la boite de dialogue
PostMessage h, WM_KEYDOWN, VK_RETURN, 0
PostMessage h, WM_KEYUP, VK_RETURN, 0
Exit Sub
Messages postés
27
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Tout à fait d'accord, je connais bien l'Automation, mais mon but final est de piloter framemaker (car pour des operations precises il faut manipuler un grand nombre de selections) et là l'automation est tres reduite; et cela ne m'explique pas pourquoi postmessage ou senmessage ne fonctionnent pas alors que spy enregistre bien les commandes avec des item menu.(valable pour open office..?)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
Pour piloter Word et Excel, possible de passer par l'Automation (Comme VBA)

GetObject(,"Word.Application")

etc.
Messages postés
27
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Bonjour
Enfin sur la base de ton code j'arrive à piloter et meme modifier wordpad ou notepad, parcontre d'autres appli comme word,excel, writer,framemaker cela ne marche pas. SPY ne voit pas les commandes WM_COMMAND, il envoi des WM_SYSKKEYDONW,WM_SYSKEYUP .....Je n'arrive pas à reproduire ces commandes sous vb, rien ne marche.
Si tu as une idée cela m'aiderais bien
Merci
Messages postés
27
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Bonjour,
Je precise mon pb:avec la cde 'sendmessage wm_command,2,0& ' j'ouvre bien la boite de dialogue fichier, mais ensuite mon progr vb perd la main car c'est une boite modale, donc toutes mes commandes suivantes ne sont pas executées tant que la boîte est ouverte.Or je veux remplir avec vb la zone de texte du 'nom de fichier' (en fait je voudrais piloter complètement les menus de notepad.Merci pour une bonne idée
Afficher les 63 commentaires

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.