[VB.NET/C#] Des cliques qui n'utilisent pas votre souris | 2019

HollyMolly

Membre
4 Mars 2019
19
1
24
20
Bonjour, bonsoir,
En 2012, Bit-X présentait une méthode pour effectuer des cliques qui ne monopolisent pas la souris. Cette méthode n'étant plus fonctionnelle sur toutes les fenêtres, je vous propose la méthode des PostMessage. Si vous souhaitez voir celle de Bit-X, cliquez ici.
Sans plus attendre, commençons...

Pour utiliser les PInvoke, vous devez importer ceci :
Code:
Imports System.Runtime.InteropServices

Public Class MaClasseGeniale

End Class
Ensuite, on va importer les fonctions qui nous intéressent. Le code n'est pas commenté, rien n'est à expliquer ici.
Pour cela, ajoutez ceci:
Code:
 Public Class MaClasseGeniale
 
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Public Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
    End Function

    Public Enum WindowMessages As UInteger
        WM_LBUTTONUP = &H202
        WM_LBUTTONDOWN = &H201
    End Enum
    
End Class
On peut maintenant venir créer notre fonction de clique. Elle sera un Sub, prendra 3 paramètres (iX, iY, Hwnd) et se nommera LClick:
Code:
Public Shared Sub LClick(ByVal iX As Integer, ByVal iY As Integer, ByVal hwnd As IntPtr)
End Sub
Explications:
-iX est la position X désirée du clique.
-iY est la position Y désirée du clique.
-Hwnd est le Handle de la fenêtre dans laquelle on désire cliquer. J'y reviendrait après.

A l'intérieur de LClick, ajoutez ceci:
Code:
Dim ClickPos As IntPtr 'On convertit les paramètres pour les utiliser avec PostMessage
Dim Btn As IntPtr 'On convertit les paramètres pour les utiliser avec PostMessage

ClickPos = GetHiLoWord(CInt(iX), CInt(iY)) 'Cette fonction vous sera donnée plus tard
Btn = CUInt(Keys.LButton) 'On convertit les paramètres pour les utiliser avec PostMessage

PostMessage(hwnd, WindowMessages.WM_LBUTTONDOWN, Btn, ClickPos) 'On appuie sur le bouton gauche aux position données
Threading.Thread.Sleep(200) 'On attend 0.2 secondes le temps que le clique s'effectue
PostMessage(hwnd, WindowMessages.WM_LBUTTONUP, Btn, ClickPos) 'On relâche le bouton gauche aux position données
Et maintenant, voilà la fonction GetHiLoWord:
Code:
Public Shared Function GetHiLoWord(ByVal Lo As Short, ByVal Hi As Short) As IntPtr
Return CInt(Hi) << 16 Or Lo
End Function


Pour appeler la fonction, il suffit simplement de faire:
Code:
LClick(0, 0, MonProcess.MainWindowHandle)
Certaines fenêtres, comme Dofus par exemple, changent de Handle, rendant l'opération impossible. Si votre fenêtre en fait parti, utilisez ceci pour résoudre le problème:

Code:
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Shared Function FindWindow(
ByVal lpClassName As String,
ByVal lpWindowName As String) As IntPtr
End Function
Maintenant vous pouvez cliquer sur n'importe quelle fenêtre comme ceci (exemple Dofus) :
Code:
Dim MonHandle As IntPtr = FindWindow("ApolloRuntimeContentWindow", "Dofus")
LClick(0, 0, MonHandle)

Les Liens :
FindWindow : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
PostMessage : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
Les divers Messages pour compléter un bot : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
Process.MainWindowHandle : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!