Click avec SendMessage

irvine31 Messages postés 23 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 28 juin 2012 - 22 juin 2012 à 23:06
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

12 réponses

djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
23 juin 2012 à 01:40
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.

@+
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
23 juin 2012 à 01:43
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
0
irvine31 Messages postés 23 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 28 juin 2012
23 juin 2012 à 09:24
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 09:56
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
irvine31 Messages postés 23 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 28 juin 2012
23 juin 2012 à 10:21
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 ...
0
Utilisateur anonyme
23 juin 2012 à 10:37
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 10:50
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 10:52
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
0
Utilisateur anonyme
23 juin 2012 à 10:54
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 11:00
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
0
Utilisateur anonyme
23 juin 2012 à 11:03
Non, tu as bien lu
Comme d'habitude, j'ai lu en diagonale. Merci de ne pas tenir compte de mon code exemple.
0
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
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 !
0
Rejoignez-nous