Prog windows : Simuler un clic dans un menu

J’ai une appli windows XP complexe commerciale. Je voudrais écrire un prog en C/C++ qui me lance cette appli en chargeant le bon fichier (ça c’est facile si system(blabla) marche sous windows). Le pb, c’est que je vourdrais simuler ensuite un clic sur l’un des item d’un menu puis fermer l’appli (ce qui revient à simuler un clic sur fichier->quiter). On peut aussi penser simuler l’appui sur des touches du clavier aller chercher l’item voulu dans les menus.
Est ce possible? Vu l’application envisagée, ça ne peut pas être une bisouille : il faut que ce soit robuste.

L’appli en question propose bien une interface DDE mais peu de fonctions sont accessibles par ce biais…et surtout pas celle qui m’intéresse :frowning:

ps : je n’y connais rien en prog windows mais avec si on me donne un exemple, je suis heureux.
pps : le C/C++ par contre, ça je connais :slight_smile: Si vous préférez python je veux bien aussi. Je m’en fiche, ce que je voudrais c’est savoir si on peut faire ce truc.

Arf ca va etre un tout petit peu la merde de faire ca. Je ne suis meme pas sure que ce que je vais te dire marche, mais dans la logiqu ca devrait fonctioner.

La premiere etape est de trouver le handle de la fenetre ou est place le composant.

Pour cela tu peux utiliser la fontion FindWindowEx de l’api win32 pour trouver ta fenetre.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/findwindowex.asp

Une fois ce handle trouve, tu reappel cette fonction avec les bon parametres pour retrouver le handle du bouton sur le quel tu veux simuler le click.

Une fois ce handle trouve, recupere les positions et la taille de ce bouton et utilise la fonction “SendMessage” de la win32 api sur le handle de ta fenetre (pas celui du bouton) avec comme parametre de message WM_LBUTTONDOWN ainsi qu’une position dans le bouton que tu auras trouve grace a ce que tu as recupere plus haut. Attention au niveau de la position je ne sais pas si il faut l’envoyer celon les coordonnée de la fenetre parente ou celon les coordonnées ecran. Dans ce cas la tu peux utiliser la fonction “ClientToScreen” pour retrouver la position du bouton a l’ecran http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/cordspac_2tny.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_lbuttondown.asp

OK merci de ta réponse. Non ça c’est trop la m**** ça ne passera jamais dans nos normes de “qualité”:slight_smile:
Mais ça ne peut pas être plus simple si on veut non pas cliquer sur un bouton mais déclancher un item dans un menu (Fichier->Imprimer par exmeple). Peut on récupérer la liste des item des menu d’une appication? Peut on lui envoyer un message pour déclencher l’action correspondat à un de ces item??

Bas si tu regarde la doc de findwindow, il y a un truc sur les menu il me semble.

Bonsoir,

en VB.net il y auait quelles solutions ?

Merci

La même étant donné que tu peux utiliser les API via .net, même VB …

Pkoi pas simplement utiliser un jscript et des typekeys ?

Tu as des examples d’utilisation ?

qu’est ce que c’est ?

Merci à vous deux


Private Declare Auto Function FindWindow Lib "user32" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As IntPtr
Private Declare Auto Function GetWindowText Lib "user32" ( _
   ByVal hwnd As IntPtr, _
   ByVal lpString As String, _
   ByVal cch As Integer) As Integer
 
Private Const lpClassName = "Winamp v1.x"
Private Const strTtlEnd = " - Winamp"
 
Private Function GetWinampSong() As String
    Dim hwnd As IntPtr = FindWindow(lpClassName, vbNullString)
 
    Dim lpText As String
 
    If hwnd.Equals(IntPtr.Zero) Then Return "Not running"
 
    lpText = New String(Chr(0), 100)
    Dim intLength As Integer = GetWindowText(hwnd, lpText, _
      lpText.Length)
 
    If (intLength <= 0) OrElse (intLength > lpText.Length) _
             Then Return "Unknown"
 
    Dim strTitle As String = lpText.Substring(0, intLength)
    Dim intName As Integer = strTitle.IndexOf(strTtlEnd)
    Dim intLeft As Integer = strTitle.IndexOf("[")
    Dim intRight As Integer = strTitle.IndexOf("]")
 
    If (intName >= 0) AndAlso (intLeft >= 0) AndAlso _
            (intName < intLeft) AndAlso _
       (intRight >= 0) AndAlso (intLeft + 1 < intRight) Then _
        Return strTitle.Substring(intLeft + 1, intRight - intLeft - 1)
 
    If (strTitle.EndsWith(strTtlEnd)) AndAlso _
        (strTitle.Length > strTtlEnd.Length) Then _
        strTitle = strTitle.Substring(0, _
          strTitle.Length - strTtlEnd.Length)
 
    Dim intDot As Integer = strTitle.IndexOf(".")
    If (intDot > 0) AndAlso (IsNumeric( _
           strTitle.Substring(0, intDot))) Then _
        strTitle = strTitle.Remove(0, intDot + 1)
 
    Return strTitle.Trim
End Function

Source : codeproject