Click avec SendMessage

Messages postés
23
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
28 juin 2012
- - Dernière réponse : irvine31
Messages postés
23
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
28 juin 2012
- 23 juin 2012 à 13:46
Bonjour,
J'ai du mal à comprendre comment utiliser SendMessage ...
Dans mon cas, j'aimerais simuler un click dans un endroit précis d'une autre fenêtre.

Voici mon code :

SendMessage(Personnage.MainWindowHandle, &H200, 0, MAKELONG(Cursor.Position.X, Cursor.Position.Y))
SendMessage(Personnage.MainWindowHandle, &H201, &H1, MAKELONG(Cursor.Position.X, Cursor.Position.Y))
SendMessage(Personnage.MainWindowHandle, &H202, &H1, MAKELONG(Cursor.Position.X, Cursor.Position.Y))
 
Public Shared Function MAKELONG(ByVal low As Integer, ByVal high As Integer) As Long
    Return (high * &H10000&) Or (low And &HFFFF&)
End Function


Merci pour vos futurs réponses
Afficher la suite 

12 réponses

Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
25 mai 2013
0
Merci
Bonsoir irvine31.

Je m'étais penché sur le problème il y a quelques mois et j'avais trouvé ce code :

    Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)


            p.X = CType(438, Integer)
            p.Y = CType(680, Integer)
            Cursor.Position = p
            mouse_event(2, 0, 0, 0, 1)
            mouse_event(4, 0, 0, 0, 1)
            Threading.Thread.Sleep(1295)
            mouse_event(2, 0, 0, 0, 1)
            mouse_event(4, 0, 0, 0, 1)


Il me semble que cela simulait un clic. Tu utilises p.X et p.Y pour définir l'emplacement de la souris.

@+
Commenter la réponse de djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
25 mai 2013
0
Merci
Tu n'as pas besoin de la deuxième partie après le Sleep...
A ce moment là, j'avais fait un test en simulant 2 clics espacés de 1295 millisecondes.

Tu n'as donc besoin que de ça :

Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)


            p.X = CType(438, Integer)
            p.Y = CType(680, Integer)
            Cursor.Position = p
            mouse_event(2, 0, 0, 0, 1) 'Clic de la souris
            mouse_event(4, 0, 0, 0, 1) 'Relâchement du bouton
Commenter la réponse de djedjeska
Messages postés
23
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
28 juin 2012
0
Merci
Merci pour ta réponse,
Mais dans mon cas, la fenêtre n'est pas forcement visible, c'est pour ça que j'ai absolument besoin de "SendMessage". :p
Commenter la réponse de irvine31
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bonjour,

- tu ne pourras rien envoyer à cette fenêtre sans qu'elle ne soit celle active.
- quelle est cette fenêtre ? toutes n'accepteront pas de tels envois;


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
23
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
28 juin 2012
0
Merci
Bonjour,
La fenêtre visé est celle d'un jeu vidéo.
J'ai vu un programme codé en VB.NET envoyer les identifiants sans que la fenêtre ne soit visible.
J'ai demandé au créateur comment faisait t-il, il m'a dit que c'est grâce à SendMessage.

Je pense que je suis sure la bonne voit car le clique se manifeste sur la fenêtre, mais pas au bon endroit ...
Commenter la réponse de irvine31
0
Merci
Bonjour,

Voici comment afficher un 4 sur la calculette windows
Essaie voir avec ton application. Le nom du processus ainsi que les coordonnées de clic sont à changer bien entendu ;)

Option Strict On
Imports System.Runtime.InteropServices
Public Class Form1
    <DllImport("user32.dll")> _
    Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByRef lParam As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll")> _
    Shared Function ChildWindowFromPoint(ByVal hWnd As IntPtr, ByVal pnt As Point) As IntPtr
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'recherche du process calculatrice
        Dim p() As Process = Process.GetProcessesByName("calc")
        's'il existe ...
        If p.Length > 0 Then
            'déterminatrion du handle de la calculatrice
            Dim handle_calc As IntPtr = p(0).MainWindowHandle
            's'il existe ...
            If handle_calc <> IntPtr.Zero Then
                'point (à changer) sur lequel appliquer le clic (ici le bouton 4)
                Dim point_calc As Point = New Point(70, 120)
                'recherche du handle de l'objet sur lequel cliquer selon ses coordonnées
                Dim handle_objet As IntPtr = ChildWindowFromPoint(handle_calc, point_calc)
                's'il existe...
                If handle_objet <> IntPtr.Zero Then
                    'on clique dessus
                    SendMessage(handle_objet, &HF5&, 1, IntPtr.Zero)
                End If
            End If
        End If
    End Sub

End Class
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
La fenêtre visé est celle d'un jeu vidéo

Toutes les chances que ce soit alors en DirectX (et maigres chances que soit alors acceptée la simulation).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Il est de toutes manières bien plus sain de "jouer à armes égales" avec les autres. Quel peut donc être l'intérêt de jouer sans jouer ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Bonjour ucfoutu,

J'ai demandé au créateur comment faisait t-il, il m'a dit que c'est grâce à SendMessage

Donc il ne s'agit pas d'un jeu DirectX.
Bon week end
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bonjour, banana32,
moi, je lis :
J'ai vu un programme codé en VB.NET envoyer les identifiants sans que la fenêtre ne soit visible.
J'ai demandé au créateur comment faisait t-il, il m'a dit que c'est grâce à SendMessage.

et me dis :
- que rien ne montre qu'il s'agit d'un programme agissant sur cette fenêtre-là (ce jeu-là)
- que le propos de "ce programme" était autre encore
Je lis trop vite ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
Non, tu as bien lu
Comme d'habitude, j'ai lu en diagonale. Merci de ne pas tenir compte de mon code exemple.
Commenter la réponse de Utilisateur anonyme
Messages postés
23
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
28 juin 2012
0
Merci
Il est de toutes manières bien plus sain de "jouer à armes égales" avec les autres.


C'est bien pour ça que j'ai précisé qu'il ne s’agissait que d'envoyer les identifiants au jeu

Sinon, mon problème est résolu :
Le code fonctionnait très bien sauf que les point X et Y que je demandais était invalide
Je les ai juste remplacé par un valide et tout fonctionne à merveille !!!
Merci pour tout !
Commenter la réponse de irvine31