Tweath
Tweath

Reputation: 134

Sending keys to a game

So I'm stuck with a problem, I'm trying to send keys to a game and I have the game in the foreground with help of SetForegroundWindow and I'm using SendInputs API to send the keys to the game.

If I focus on another application the keys are sent to that application but as soon as I focus on the application I want the keys to be sent to, they don't appear there.

I'm trying to save me some time to recruit guild members for my guild and with that I'm trying to send keys to the game.

 [DllImport("user32.dll")]
 private static extern bool SetForegroundWindow(IntPtr hWnd);

 [DllImport("user32.dll")]
 static extern IntPtr GetMessageExtraInfo();

 [DllImport("user32.dll", SetLastError = true)]
 static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

 Process[] procs = Process.GetProcessesByName("BlackDesert64");
 if (procs.Length > 0)
 {
   if (procs[0].MainWindowHandle != IntPtr.Zero)
   {
      SetForegroundWindow(procs[0].MainWindowHandle);
      Thread.Sleep(1000);
   }
 }
 INPUT[] inputs = new INPUT[]
 {
     new INPUT
     {
         type = INPUT_KEYBOARD,
         u = new InputUnion
         {
             ki = new KEYBDINPUT
             {
                 wVk = 0x49,
                 wScan = 0049,
                 dwFlags = KEYEVENTF_UNICODE,
                 dwExtraInfo = GetMessageExtraInfo(),
             }
         }
     },
     new INPUT
     {
         type = INPUT_KEYBOARD,
         u = new InputUnion
         {
             ki = new KEYBDINPUT
             {
                 wVk = 0x49,
                 wScan = 0049,
                 dwFlags = KEYEVENTF_KEYUP,
                 dwExtraInfo = GetMessageExtraInfo(),
             }
         }
    }
};

SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));

Rest of the code: https://pastebin.com/RUm7A311

UPDATE

So I've found the API Interceptor that allows to send keys to a game that uses DirectX and I've set it up but still no outcome.. anyone who can point me in the right direction?

Upvotes: 6

Views: 7371

Answers (3)

Vijay Thorat
Vijay Thorat

Reputation: 98

For your problem here is trick,

Use

String Keys = "Test";
SendKeys.Send(Keys);

this code to send keys to any application.

Just put this code in timer_start() add some delay before starting of timer and stop timer after execution.

Now run your project which will initiate timer, before timeout open your game and wait for keys to press!!

Check this link which contains all Keys and their code to send https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

Upvotes: 0

Antony
Antony

Reputation: 1241

Implementation using SendMessage (no need to focus on the window).

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindows);

[DllImport("User32.dll")]
private static extern Int32 SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);

void SendKeys()
{
    IntPtr hWnd = FindWindow("Notepad", "Untitled - Notepad");
    if (!hWnd.Equals(IntPtr.Zero))
    {
        IntPtr edithWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", null);
        if (!edithWnd.Equals(IntPtr.Zero))
        {
            SendMessage(edithWnd, WM_SETTEXT, IntPtr.Zero, new StringBuilder("Test"));
        }
    }
}

Reference: how-do-i-input-to-another-application

Upvotes: 1

Rasmus Søborg
Rasmus Søborg

Reputation: 3695

What does value SendInput return?

If it returns 0, then its an indication that some error has happened. You can try to invoke GetLastError, to see if the input was blocked by the UIPI, alternatively try to run your code with local administrator privileges.

Are you sure that procs[0].MainWindowHandle is the correct window handle?

Lastly try to send the message directly to the handle using SendMessage.

Upvotes: 4

Related Questions