How to Send Keystrokes to a DirectX Game in C#? menu

User Tag List

Page 1 of 2 12 LastLast
Results 1 to 15 of 20
  1. #1
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    How to Send Keystrokes to a DirectX Game in C#?

    Nvm. Got PostMsg to Work.

    But instead how do you get Pointers from Cheat Engine to C# Port them. So far i got...
    Code:
    System.Diagnostics.Process[] myprocess = System.Diagnostics.Process.GetProcessesByName(Processname); 
                    preader.ReadProcess = myprocess[0]; //Shows an Empty Array Spot @ 0. Which is filled by the Line Above... Why is that? Processname = Wow.exe and i tryed World of Warcraft
    
                    preader.OpenProcess();
                    int byteswritten;
                    int bytesread;
                    int value;
                    int pointerbase;
                    byte[] memory;
    
                    memory = preader.ReadProcessMemory((IntPtr)0x8843636, 4, out bytesread);
                    pointerbase = BitConverter.ToInt32(memory, 0);
                    pointerbase += 0x388;
                    memory = preader.ReadProcessMemory((IntPtr)pointerbase, 4, out bytesread);
                    value = BitConverter.ToInt32(memory, 0);
                    //now you are reading the value from and its value has been assigned to the int 'value'
                    MessageBox.Show(value.ToString() + " " + pointerbase);
    Last edited by luciferc; 10-07-2008 at 04:52 PM.

    How to Send Keystrokes to a DirectX Game in C#?
  2. #2
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Code:
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
            public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
    /// <summary>
            /// Virtual Keys
            /// </summary>
            public enum VirtualKeyStates : int
            {
                VK_LBUTTON = 0x01,
                VK_RBUTTON = 0x02,
                VK_CANCEL = 0x03,
                VK_MBUTTON = 0x04,
                //
                VK_XBUTTON1 = 0x05,
                VK_XBUTTON2 = 0x06,
                //
                VK_BACK = 0x08,
                VK_TAB = 0x09,
                //
                VK_CLEAR = 0x0C,
                VK_RETURN = 0x0D,
                //
                VK_SHIFT = 0x10,
                VK_CONTROL = 0x11,
                VK_MENU = 0x12,
                VK_PAUSE = 0x13,
                VK_CAPITAL = 0x14,
                //
                VK_KANA = 0x15,
                VK_HANGEUL = 0x15, /* old name - should be here for compatibility */
                VK_HANGUL = 0x15,
                VK_JUNJA = 0x17,
                VK_FINAL = 0x18,
                VK_HANJA = 0x19,
                VK_KANJI = 0x19,
                //
                VK_ESCAPE = 0x1B,
                //
                VK_CONVERT = 0x1C,
                VK_NONCONVERT = 0x1D,
                VK_ACCEPT = 0x1E,
                VK_MODECHANGE = 0x1F,
                //
                VK_SPACE = 0x20,
                VK_PRIOR = 0x21,
                VK_NEXT = 0x22,
                VK_END = 0x23,
                VK_HOME = 0x24,
                VK_LEFT = 0x25,
                VK_UP = 0x26,
                VK_RIGHT = 0x27,
                VK_DOWN = 0x28,
                VK_SELECT = 0x29,
                VK_PRINT = 0x2A,
                VK_EXECUTE = 0x2B,
                VK_SNAPSHOT = 0x2C,
                VK_INSERT = 0x2D,
                VK_DELETE = 0x2E,
                VK_HELP = 0x2F,
                //
                VK_LWIN = 0x5B,
                VK_RWIN = 0x5C,
                VK_APPS = 0x5D,
                //
                VK_SLEEP = 0x5F,
                //
                VK_NUMPAD0 = 0x60,
                VK_NUMPAD1 = 0x61,
                VK_NUMPAD2 = 0x62,
                VK_NUMPAD3 = 0x63,
                VK_NUMPAD4 = 0x64,
                VK_NUMPAD5 = 0x65,
                VK_NUMPAD6 = 0x66,
                VK_NUMPAD7 = 0x67,
                VK_NUMPAD8 = 0x68,
                VK_NUMPAD9 = 0x69,
                VK_MULTIPLY = 0x6A,
                VK_ADD = 0x6B,
                VK_SEPARATOR = 0x6C,
                VK_SUBTRACT = 0x6D,
                VK_DECIMAL = 0x6E,
                VK_DIVIDE = 0x6F,
                VK_F1 = 0x70,
                VK_F2 = 0x71,
                VK_F3 = 0x72,
                VK_F4 = 0x73,
                VK_F5 = 0x74,
                VK_F6 = 0x75,
                VK_F7 = 0x76,
                VK_F8 = 0x77,
                VK_F9 = 0x78,
                VK_F10 = 0x79,
                VK_F11 = 0x7A,
                VK_F12 = 0x7B,
                VK_F13 = 0x7C,
                VK_F14 = 0x7D,
                VK_F15 = 0x7E,
                VK_F16 = 0x7F,
                VK_F17 = 0x80,
                VK_F18 = 0x81,
                VK_F19 = 0x82,
                VK_F20 = 0x83,
                VK_F21 = 0x84,
                VK_F22 = 0x85,
                VK_F23 = 0x86,
                VK_F24 = 0x87,
                //
                VK_NUMLOCK = 0x90,
                VK_SCROLL = 0x91,
                //
                VK_OEM_NEC_EQUAL = 0x92, // '=' key on numpad
                //
                VK_OEM_FJ_JISHO = 0x92, // 'Dictionary' key
                VK_OEM_FJ_MASSHOU = 0x93, // 'Unregister word' key
                VK_OEM_FJ_TOUROKU = 0x94, // 'Register word' key
                VK_OEM_FJ_LOYA = 0x95, // 'Left OYAYUBI' key
                VK_OEM_FJ_ROYA = 0x96, // 'Right OYAYUBI' key
                //
                VK_LSHIFT = 0xA0,
                VK_RSHIFT = 0xA1,
                VK_LCONTROL = 0xA2,
                VK_RCONTROL = 0xA3,
                VK_LMENU = 0xA4,
                VK_RMENU = 0xA5,
                //
                VK_BROWSER_BACK = 0xA6,
                VK_BROWSER_FORWARD = 0xA7,
                VK_BROWSER_REFRESH = 0xA8,
                VK_BROWSER_STOP = 0xA9,
                VK_BROWSER_SEARCH = 0xAA,
                VK_BROWSER_FAVORITES = 0xAB,
                VK_BROWSER_HOME = 0xAC,
                //
                VK_VOLUME_MUTE = 0xAD,
                VK_VOLUME_DOWN = 0xAE,
                VK_VOLUME_UP = 0xAF,
                VK_MEDIA_NEXT_TRACK = 0xB0,
                VK_MEDIA_PREV_TRACK = 0xB1,
                VK_MEDIA_STOP = 0xB2,
                VK_MEDIA_PLAY_PAUSE = 0xB3,
                VK_LAUNCH_MAIL = 0xB4,
                VK_LAUNCH_MEDIA_SELECT = 0xB5,
                VK_LAUNCH_APP1 = 0xB6,
                VK_LAUNCH_APP2 = 0xB7,
                //
                VK_OEM_1 = 0xBA, // ';:' for US
                VK_OEM_PLUS = 0xBB, // '+' any country
                VK_OEM_COMMA = 0xBC, // ',' any country
                VK_OEM_MINUS = 0xBD, // '-' any country
                VK_OEM_PERIOD = 0xBE, // '.' any country
                VK_OEM_2 = 0xBF, // '/?' for US
                VK_OEM_3 = 0xC0, // '`~' for US
                //
                VK_OEM_4 = 0xDB, // '[{' for US
                VK_OEM_5 = 0xDC, // '|' for US
                VK_OEM_6 = 0xDD, // ']}' for US
                VK_OEM_7 = 0xDE, // ''"' for US
                VK_OEM_8 = 0xDF,
                //
                VK_OEM_AX = 0xE1, // 'AX' key on Japanese AX kbd
                VK_OEM_102 = 0xE2, // "<>" or "|" on RT 102-key kbd.
                VK_ICO_HELP = 0xE3, // Help key on ICO
                VK_ICO_00 = 0xE4, // 00 key on ICO
                //
                VK_PROCESSKEY = 0xE5,
                //
                VK_ICO_CLEAR = 0xE6,
                //
                VK_PACKET = 0xE7,
                //
                VK_OEM_RESET = 0xE9,
                VK_OEM_JUMP = 0xEA,
                VK_OEM_PA1 = 0xEB,
                VK_OEM_PA2 = 0xEC,
                VK_OEM_PA3 = 0xED,
                VK_OEM_WSCTRL = 0xEE,
                VK_OEM_CUSEL = 0xEF,
                VK_OEM_ATTN = 0xF0,
                VK_OEM_FINISH = 0xF1,
                VK_OEM_COPY = 0xF2,
                VK_OEM_AUTO = 0xF3,
                VK_OEM_ENLW = 0xF4,
                VK_OEM_BACKTAB = 0xF5,
                //
                VK_ATTN = 0xF6,
                VK_CRSEL = 0xF7,
                VK_EXSEL = 0xF8,
                VK_EREOF = 0xF9,
                VK_PLAY = 0xFA,
                VK_ZOOM = 0xFB,
                VK_NONAME = 0xFC,
                VK_PA1 = 0xFD,
                VK_OEM_CLEAR = 0xFE,
                //
                VK_0 = 0x30,
    	        VK_1 = 0x31,
                VK_2 = 0x32,
                VK_3 = 0x33,
                VK_4 = 0x34,
                VK_5 = 0x35,
                VK_6 = 0x36,
                VK_7 = 0x37,
                VK_8 = 0x38,
                VK_9 = 0x39
            }
    
            ///summary> 
            /// Virtual Messages 
            /// </summary> 
            public enum WMessages : int
    
    /// <summary>
            /// Sends a message to the specified window
            /// </summary>
            /// <param name="winTitle">string Title of window</param>
            /// <param name="Key">Virtual key code of the key to send</param>
            public static void ControlSendMessage(string winTitle, VirtualKeyStates Key, bool shift)
            {
                IntPtr hWnd = FindWindow(null, winTitle);
    
                if (shift == true)
                {
                    //send shift down
                    SendMessage(hWnd, 0x100, (int)VirtualKeyStates.VK_SHIFT, 0);
                    //send key down
                    SendMessage(hWnd, 0x100, (int)Key, 0);
                    //sleep 50ms
                    Thread.Sleep(50);
                    //send key up
                    SendMessage(hWnd, 0x101, (int)Key, 0);
                    //send shift up
                    SendMessage(hWnd, 0x101, (int)VirtualKeyStates.VK_SHIFT, 0);
                }
    
                else
                {
                    //send key down
                    SendMessage(hWnd, 0x100, (int)Key, 0);
                    //sleep 50ms
                    Thread.Sleep(50);
                    //send key up
                    SendMessage(hWnd, 0x101, (int)Key, 0);
                }
            }
    
            /// <summary>
            /// Sends a Keydown message(0x100) to the specified window with a Virtual Key
            /// </summary>
            /// <param name="winTitle">Window Title</param>
            /// <param name="Key">Virtual Key to Send</param>
            public static void KeyDown(string winTitle, VirtualKeyStates Key)
            {
                IntPtr hWnd = FindWindow(null, winTitle);
                SendMessage(hWnd, 0x100, (int)Key, 0);
            }
    
            /// <summary>
            /// Sends a Keydup message(0x101) to the specified window with a Virtual Key
            /// </summary>
            /// <param name="winTitle">Window Title</param>
            /// <param name="Key">Virtual Key to Send</param>
            public static void KeyUp(string winTitle, VirtualKeyStates Key)
            {
                IntPtr hWnd = FindWindow(null, winTitle);
                SendMessage(hWnd, 0x101, (int)Key, 0);
            }
    
    
            /// <summary> 
            /// Sends a message to the specified handle 
            /// </summary> 
            public void _SendMessage(IntPtr handle, int Msg, int wParam, int lParam)
            {
                SendMessage(handle, Msg, wParam, lParam);
            }
    and here's how to use it
    Code:
    ControlSendMessage("World of Warcraft",
     handy_input.VirtualKeyStates.VK_1,
     false
    );
    hope this helps atleast works for wow for sending keystrokes

    meh u edited too fast.

    if u find a pointer with CheatEngine to get the base adress of ie. wow.exe u can do like this.

    Code:
    using System.Diagnostics;
    
    Process[] p = Process.GetProcessesByName("Wow");
    
    ProcessModule pmWow = p[0].MainModule;
    
    int testIntegrer =  Memory.ReadInt(hProcess, (int)pmWow.BaseAdress + (offset found with cheatengine);
    Console.WriteLine(testIntegrer");
    there u go! have a nice evning!

    EDIT: found this on edgeofnowhere.cc it's prolly the best i can think of.

    Code:
    public int GetBaseAddress(int processID, string moduleName) 
        { 
          Process process = Process.GetProcessById(processID); //get Process 
          ProcessModuleCollection Modules = process.Modules; //get all Modules of this Process 
          ProcessModule pModule; 
          int baseAddress = 0; 
    
          for (int i = 0; i < Modules.Count; i++) 
          { 
            pModule = Modules[i]; 
            if (pModule.ModuleName.Equals(moduleName)) 
            { 
              baseAddress = (int) pModule.BaseAddress; 
              break; 
            } 
          } 
          return baseAddress; 
        }
    Last edited by Nesox; 10-07-2008 at 05:18 PM.

  3. #3
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Okay still haveing a problem w/ Pointers...
    Code:
    Process[] myprocess = Process.GetProcessesByName(NAME);
                    preader.ReadProcess = myprocess[0];
    
                    preader.OpenProcess();
                    int byteswritten;
                    int bytesread;
                    int value;
                    int pointerbase;
                    byte[] memory;
    memory = preader.ReadProcessMemory((IntPtr)0x0086F174, 4, out bytesread);
                    pointerbase = BitConverter.ToInt32(memory, 0);
                    MessageBox.Show(pointerbase.ToString());
                    pointerbase += 0x388;
                    memory = preader.ReadProcessMemory((IntPtr)pointerbase, 4, out bytesread);
                    value = BitConverter.ToInt32(memory, 0);
                    //now you are reading the value from and its value has been assigned to the int 'value'
                    MessageBox.Show(value.ToString() + " " + pointerbase);
    Shows a large -##### at the end for pointer and an empty 0 for value
    Last edited by luciferc; 10-07-2008 at 06:27 PM.

  4. #4
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    well either it's not the right adress ure using or it's static if it in CE says wow.exe+034FAD u need to get the baseadress of wow just a tip

  5. #5
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    So its get Hex(Base Address + Dec(Value#2))
    Find it.. then +Offset

    EXE+Value#2

    wow.exe+939082 etc..

    GetBaseAddress(int processID, string moduleName)
    What would i pass in for it though. Can't find something that returns a ProccessID for C# by googling and the Module name is wow or wow.exe or world of warcraft?


    Code:
    public int GetBaseAddress(int processID, string moduleName) 
        { 
          Process process = Process.GetProcessById(processID); //get Process 
          ProcessModuleCollection Modules = process.Modules; //get all Modules of this Process 
          ProcessModule pModule; 
          int baseAddress = 0; 
    
          for (int i = 0; i < Modules.Count; i++) 
          { 
            pModule = Modules[i]; 
            if (pModule.ModuleName.Equals(moduleName)) 
            { 
              baseAddress = (int) pModule.BaseAddress; 
              break; 
            } 
          } 
          return baseAddress; 
        }

  6. #6
    Xarg0's Avatar Member
    Reputation
    61
    Join Date
    Jan 2008
    Posts
    389
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    You don't need to sleep if you use SendMessage() because the function doesn't return until the message is taken from the message quew :-)
    I hacked 127.0.0.1

  7. #7
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by luciferc View Post
    So its get Hex(Base Address + Dec(Value#2))
    Find it.. then +Offset

    EXE+Value#2

    wow.exe+939082 etc..

    GetBaseAddress(int processID, string moduleName)
    What would i pass in for it though. Can't find something that returns a ProccessID for C# by googling and the Module name is wow or wow.exe or world of warcraft?


    Code:
    public int GetBaseAddress(int processID, string moduleName) 
        { 
          Process process = Process.GetProcessById(processID); //get Process 
          ProcessModuleCollection Modules = process.Modules; //get all Modules of this Process 
          ProcessModule pModule; 
          int baseAddress = 0; 
    
          for (int i = 0; i < Modules.Count; i++) 
          { 
            pModule = Modules[i]; 
            if (pModule.ModuleName.Equals(moduleName)) 
            { 
              baseAddress = (int) pModule.BaseAddress; 
              break; 
            } 
          } 
          return baseAddress; 
        }
    u can get the id from myprocess[0].Id but it's almost always 0x00401000
    the base adress.

    if u place a breakpoint where it takes all the modules.
    Code:
    ProcessModuleCollection Modules = process.Modules;
    then u can see the names of them and it's Wow.exe and it's prolly gonna be 0x00401000

    Code:
    int BaseAdress = GetBaseAdress(myprocess[0].Id, "Wow.exe");
    
    int test = Memory.ReadInt( BaseAdress + 0x939082 ) ;
    
    and u get the value if it's wow.exe+939082

  8. #8
    Shynd's Avatar Contributor
    Reputation
    97
    Join Date
    May 2008
    Posts
    393
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Holy Jesus. My head just caved in from reading this thread.

  9. #9
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Lol. Thanks Nesox you cleared up that for me ! :P

  10. #10
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by Shynd View Post
    Holy Jesus. My head just caved in from reading this thread.
    u make me lol

    Originally Posted by luciferc View Post
    Lol. Thanks Nesox you cleared up that for me ! :P
    np

  11. #11
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Any idea what to do if Cheat Engine is not finding Pointers and how can you find the enemys Health % in any game? What to look for, as well as X,Y,Z,ROT how to find those as well is almost impossible when i think about it b/c you never know your exact rotation to do a check for.

  12. #12
    bigtimt's Avatar Active Member
    Reputation
    41
    Join Date
    Mar 2008
    Posts
    100
    Thanks G/R
    2/4
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    simple.. download WoWBasic, then add a reference to it in c#. it will give you access to all the objects in the game and all the values as noted in their descriptors

  13. #13
    luciferc's Avatar Contributor
    Reputation
    90
    Join Date
    Jul 2008
    Posts
    373
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Nty rather do it myself.

  14. #14
    bigtimt's Avatar Active Member
    Reputation
    41
    Join Date
    Mar 2008
    Posts
    100
    Thanks G/R
    2/4
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    would u like the source code for reference?

  15. #15
    Nesox's Avatar ★ Elder ★
    Reputation
    1280
    Join Date
    Mar 2007
    Posts
    1,238
    Thanks G/R
    0/3
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by luciferc View Post
    Any idea what to do if Cheat Engine is not finding Pointers and how can you find the enemys Health % in any game? What to look for, as well as X,Y,Z,ROT how to find those as well is almost impossible when i think about it b/c you never know your exact rotation to do a check for.
    have u found an adress with target health? if so just check what write to that adress then if there's an offset write it down copy the pointer

    could look like this
    Code:
    mov [eax+edx*4]

Page 1 of 2 12 LastLast

Similar Threads

  1. C++ How to send left click Mouse to a Game
    By caosmen in forum Programming
    Replies: 2
    Last Post: 09-25-2012, 05:32 AM
  2. How to send and receive emails with @blizzard.com
    By jcako in forum WoW Scam Prevention
    Replies: 10
    Last Post: 10-06-2007, 07:49 AM
  3. Replies: 16
    Last Post: 09-14-2007, 08:59 AM
  4. How fast can you type your alphabet(game)
    By Notahax in forum Gaming Chat
    Replies: 22
    Last Post: 08-21-2007, 09:15 PM
  5. How to: Send Anonymous Mail Exploit
    By Matt in forum World of Warcraft Exploits
    Replies: 9
    Last Post: 04-05-2007, 10:51 PM
All times are GMT -5. The time now is 06:28 AM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search