Besoin d'aide bot trove c#

    Publicités

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)

aeelx

Membre
Apr 28, 2010
13
0
721
Bonjour, je suis entrain de crée un bot pour trove mais j'ai un problème j'ai besoin que mon programme appuie sur la touche f qui permet de récupérer le poisson qui as mordue mais impossible d'envoyer une touche vers le jeu j'ai fais des test sur notepad++ la touche est pourtant bien pressé et marche sur notepad++ je code en c# et mon code est le suivant
6e9c171335.png


j'aimerais avoir n'importe quel aide ou différente solution possible!
Merci d'avance!
 
Last edited:

Evaelis

La Voix de la Sagesse
V
Ancien staff
Apr 28, 2010
22,949
468
1,699
Valhalla
C'est un probleme frequent avec les jeux.
Utilises SendMessage de user32.dll.
 

aeelx

Membre
Apr 28, 2010
13
0
721
Merci de ta réponse rapide aurais tu un exemple d'utilisation de cette fonction ?
je l'utilise de cette facon

int ok = SendMessage(TroveGet, 0x46, IntPtr.Zero, IntPtr.Zero);

mais visiblement aucun effet et la variable ok possède '0'
 
Last edited:

aeelx

Membre
Apr 28, 2010
13
0
721
j'ai essayé avec la méthode que tu viens d'envoyer en changeant ma ligne avec ceci
int key = 0x046;
int ok = SendMessage(TroveGet, 0x0100, (IntPtr)(key - 0x020), IntPtr.Zero);
mais rien ne ce passe non plus je ne suis pas sur du chiffre hexadécimal que devrais posséder la lettre au f d'ailleurs
 

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
On peut voir comment tu récupères le HWND de la fenêtre ?
 

aeelx

Membre
Apr 28, 2010
13
0
721
oui bien sur j'ai utiliser spy++ et FindWindow Comme ceci
IntPtr TroveGet = FindWindow("SDL_app", "Trove");
 

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
Si tu y mets un breakpoint, tu es sûr que ta variable "TroveGet" n'est pas à "null" ?
 

aeelx

Membre
Apr 28, 2010
13
0
721
elle possède une valeur ceci pour être précis 4720828
Cependant quand je fais la même chose sur un notepad une valeur et aussi trouver 10029070
mais rien n'est écrit dans le notepad avec SendMessage(TroveGet, 0x0100, (IntPtr)0x46 , IntPtr.Zero);
l'erreur viendrais alors de sendmessage var avec un SendKeys.Send cela marchais
 
Last edited:

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
Essaye de récupérer le handle fourni par le processus (Process.MainWindowHandle) de Trove.
Sinon, je pense qu'il y a une protection à hook certainement.
 

aeelx

Membre
Apr 28, 2010
13
0
721
j'ai fais une mise a jour de mon ancien post au cas ou tu ne l'ai pas vu ! je test ta facon de recuperer le handle et je te dis la diffèrence

---------- Message ajouté à 02h48 ---------- Le message précédent était à 02h46 ----------

f2de4dd7f3.png

En dessous le test du process et celui du haut le findwindow
Exactement pareille

---------- Message ajouté à 02h55 ---------- Le message précédent était à 02h48 ----------

je répête cependant que le SendMessage ne marche pas sur le notepad alors qu'il devrais le problème viens probablemetn de la mais je ne l'ai jamais utilisé de ma vie et les tutos sur internet a propos du sendmessage sont manquant
 

Misuki

Git Wizard en freelance
V
Ancien staff
Jun 15, 2012
2,303
66
954
C'est normal que rien n'est écrit dans le notepad puisque la touche que tu envois est envoyée à la fenêtre qui comporte le handle que tu fournis dans l'appelle de la méthode (le premier argument, HWND). Du coup si tu fournis le handle de la fenêtre de Trove, ça risque pas d'envoyer la touche sur le notepad :')

Je pense que c'est un problème de droits. Essai de build ta solution et de la lancer en tant qu'administrateur pour voir ?

Edit: Sinon, il faut jouer avec les pilotes, et utiliser un Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!.
 
Last edited:

aeelx

Membre
Apr 28, 2010
13
0
721
Alosr ca va de soit que quand je fais un test pour notepad je change de HWND sinon oui forcement ca marche pas j'arrive encore a me débrouiller merci xD
c'est la première que je crée ce genre de logiciel mais je connais la logique du c#
je tente l'administrateur et toujours la même chose rien ne ce passe les événement sont bien reconnue pourtant toujours
par contre le Wrapper jamais utilisé de ma vie je vais voir ca tout de suite

---------- Message ajouté à 15h50 ---------- Le message précédent était à 13h57 ----------

Alors Alors j'ai regarder le tutoriel un j'ai crée les lignes dont j'avais besoin et au moment de lancer ca me donne ca

2384f6d536.png
 

ragnarock

Membre actif
Mar 22, 2010
194
0
917
Yop,

Pour le notpad faut pas envoyer les messages à la fenêtre, mais au contrôle directement, la fenêtre ne lui forward pas ces messages apparemment.
Et pour le SendMessage, envoyer juste un WM_KEYDOWN ça marche, mais c'est pas propre. Quand on appuyer sur une touche, on relève le doigt à un moment. Ici c'est pareil, faut envoyer un WM_KEYUP.

J'ai retrouvé du code que j'avais fait pour ce genre de cas (les modifiers (ctrl, alt, shift) ne marchent pas, donc pas de majuscules non plus) :

Code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    internal class EnumWindowsData
    {
        internal string ClassName { get; set; }
        internal IntPtr Handle { get; set; }
    }

    internal static class Program
    {
        private static void Main(string[] args)
        {
            // Récupérer le handle de la fenêtre du notepad
            var hWnd = Process.GetProcessesByName("notepad").First().MainWindowHandle;
            // Récupérer le handle de l'edit du notepad
            var hEdit = GetChildWindow(hWnd, "Edit");

            Sender.Send(hEdit, "Test");

            Sender.KeyPress(hEdit, Keys.Space);

            Sender.KeyDown(hEdit, Keys.H);
            Sender.KeyDown(hEdit, Keys.H);
            Sender.KeyUp(hEdit, Keys.H);
        }


        private static IntPtr GetChildWindow(IntPtr parentHandle, string className)
        {
            EnumChildProc callback = EnumWindowCallback;
            var data = new EnumWindowsData {ClassName = className};
            EnumChildWindows(parentHandle, callback, ref data);

            return data.Handle;
        }

        private static bool EnumWindowCallback(IntPtr hWnd, ref EnumWindowsData lParam)
        {
            var sb = new StringBuilder(1024);
            GetClassName(hWnd, sb, sb.Capacity);
            var className = sb.ToString();
            if (className != lParam.ClassName)
                return true;

            lParam.Handle = hWnd;
            return false;
        }

        #region Win32

        private delegate bool EnumChildProc(IntPtr hWnd, ref EnumWindowsData lParam);

        [DllImport("user32.dll")]
        private static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc lpEnumFunc, ref EnumWindowsData lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

        #endregion
    }

    public static class Sender
    {
        private const int WM_KEYDOWN = 0x100;
        private const int WM_KEYUP = 0x101;

        private static readonly HashSet<Keys> keysPressed = new HashSet<Keys>();


        public static void Send(IntPtr hWnd, string msg)
        {
            foreach (var k in msg.Select(MapToVirtualKey))
                KeyPress(hWnd, k);
        }

        public static void KeyPress(IntPtr hWnd, Keys key)
        {
            KeyDown(hWnd, key);
            KeyUp(hWnd, key);
        }

        public static void KeyDown(IntPtr hWnd, Keys key)
        {
            if (hWnd == IntPtr.Zero)
                throw new ArgumentNullException(nameof(hWnd));

            var wParam = (uint)(key & Keys.KeyCode); // VK
            var lParam = LParam(key, 1, false);
            PostMessage(hWnd, WM_KEYDOWN, wParam, lParam);
            keysPressed.Add(key);
        }

        public static void KeyUp(IntPtr hWnd, Keys key)
        {
            if (hWnd == IntPtr.Zero)
                throw new ArgumentNullException(nameof(hWnd));

            var wParam = (uint)(key & Keys.KeyCode); // VK
            var lParam = LParam(key, 1, true);
            PostMessage(hWnd, WM_KEYUP, wParam, lParam);
            keysPressed.Remove(key);
        }

        private static uint LParam(Keys key, uint repeat, bool keyUp)
        {
            var ret = repeat | (uint)MapToScanCode(key) << 16;

            if (keysPressed.Contains(key))
                ret |= 0x40000000; // Previous key state flag
            if (keyUp)
                ret |= 0x80000000; // Transition state flag

            return ret;
        }

        private static byte MapToScanCode(Keys key)
        {
            var vKey = key & Keys.KeyCode;
            return (byte)MapVirtualKey(vKey, MapVirtualKeyMapTypes.MAPVK_VK_TO_VSC);
        }

        Private static Keys MapToVirtualKey(char c)
        {
            var vkey = VkKeyScan(c);
            var ret = (Keys)(vkey & 0xFF);
            var modifiers = vkey >> 8;

            if ((modifiers & 1) != 0)
                ret |= Keys.Shift;
            if ((modifiers & 2) != 0)
                ret |= Keys.Control;
            if ((modifiers & 4) != 0)
                ret |= Keys.Alt;

            return ret;
        }

        #region Win32

        private enum MapVirtualKeyMapTypes : uint
        {
            /// <summary>
            /// uCode is a virtual-key code and is translated into a scan code.
            /// If it is a virtual-key code that does not distinguish between left- and
            /// right-hand keys, the left-hand scan code is returned.
            /// If there is no translation, the function returns 0.
            /// </summary>
            MAPVK_VK_TO_VSC = 0x00,

            /// <summary>
            /// uCode is a scan code and is translated into a virtual-key code that
            /// does not distinguish between left- and right-hand keys. If there is no
            /// translation, the function returns 0.
            /// </summary>
            MAPVK_VSC_TO_VK = 0x01,

            /// <summary>
            /// uCode is a virtual-key code and is translated into an unshifted
            /// character value in the low-order word of the return value. Dead keys (diacritics)
            /// are indicated by setting the top bit of the return value. If there is no
            /// translation, the function returns 0.
            /// </summary>
            MAPVK_VK_TO_CHAR = 0x02,

            /// <summary>
            /// Windows NT/2000/XP: uCode is a scan code and is translated into a
            /// virtual-key code that distinguishes between left- and right-hand keys. If
            /// there is no translation, the function returns 0.
            /// </summary>
            MAPVK_VSC_TO_VK_EX = 0x03,

            /// <summary>
            /// Not currently documented
            /// </summary>
            MAPVK_VK_TO_VSC_EX = 0x04
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern uint MapVirtualKey(Keys uCode, MapVirtualKeyMapTypes uMapType);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern short VkKeyScan(char c);

        #endregion
    }
}

Pour ton jeu, j'imagine que c'est du DirectX et donc qu'il n'y a que la fenêtre principale (je suis pas sur de ça, j'ai juste encore jamais vu l'inverse). Tu peux vérifier avec spy++. Dans ce cas, pas besoin de chercher une fenêtre enfant.

C'est aussi possible que ce soit un problème de droits (Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!), tu peux vérifier que ton jeu ne tourne pas en admin (ou lancer ton programme en admin).

Si rien de ça ne marche, le jeu doit avoir une protection. Pour contourner les trucs de ce genre, tu peux utiliser/faire un driver qui va simuler des appuis de touche comme celui qu'à link Misuki. Mais là je ne peux pas t'aider, je me suis jamais lancé là-dedans.

Pour les tutos sur le SendMessage, c'est par ici: Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!.
Pour la liste des messages c'est ici: Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
 
Last edited:

aeelx

Membre
Apr 28, 2010
13
0
721
Merci d'avoir éclairer le problème du Notepad en effet ca me paraît plus logique !
Aprés pour le lien que l'on m'as link j'ai tout fais comme le tuto pris le dll le mettre en référence mais rien n'y fais toujours un plantage je vais attendre demain pour redémarrer mon pc et je mettrait a jour le plus tôt possible
 

aeelx

Membre
Apr 28, 2010
13
0
721
Alors j'ai pu faire pas mal de test j'ai telecharger WDK et j'ai suivis beaucoup de tuto pour résumer j'ai l'erreur BadImageFormatException l'erreur sur le site a l''air commune je cite
"You may get a BadImageFormatException if you don't use the proper architecture (x86 or x64) for all your projects in the solution, including this project. So you may have to download the source of this project to rebuild it to the right architecture. This should be easy and the build process should have no errors."

j'ai re-compiler moi même le dl en entier en téléchargeant la source et en utilisant les WDK j'ai pu tester la version x86 et x64 mais le problème reste le même impossible d'utiliser le dll Interceptor l'erreur étant toujours la même avais vous une autre solution que ce wrapper la ou avez vous déjà rencontré cette erreur et pouvais m'aider ?

---------- Message ajouté à 19h46 ---------- Le message précédent était à 15h57 ----------

Petite Mise a jour tout est bon maitenant le logiciel ce lance comme il faut et les dll ont l'air de fonctionner par contre il ne se passe toujours rien dans le jeu pour le moment est ce que je suis obligé d'avoir trove en premier plan pour envoyer une commande ?

---------- Message ajouté à 21h15 ---------- Le message précédent était à 19h46 ----------

Dernière mise a jour niveau Bot tout marche enfin et les problème sont réglés j'ai trouver comment tout faire marcher je me pose maitenant les question comme comment savoir que j'ai pécher une boots et comment la supprimer si j'en n'ai dans mon inventaire ! si quelqu'un a déja pu chercher quelque chose de similaire je serais trés reconnaissant merci en tout cas de toute votre aide