向游戏发送密钥

时间:2017-03-30 19:19:56

标签: c# .net sendkeys

所以我遇到了一个问题,我正在尝试将密钥发送到游戏中,并在SetForegroundWindow的帮助下将游戏放在前台,我正在使用SendInputs API将钥匙发送到游戏中。

如果我专注于另一个应用程序,密钥会被发送到该应用程序,但只要我专注于我想要发送密钥的应用程序,它们就不会出现在那里。

我正在努力节省一些时间为我的公会招募公会成员,并且我正试图将钥匙发送给游戏。

 [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)));

其余代码: https://pastebin.com/RUm7A311

更新

所以我发现API拦截器允许将密钥发送到使用DirectX的游戏并且我已经设置了但仍然没有结果......任何可以指出我正确方向的人?

3 个答案:

答案 0 :(得分:4)

SendInput 返回什么?

如果返回0,则表示发生了一些错误。您可以尝试调用GetLastError,查看输入是否被UIPI阻止,或者尝试使用本地管理员权限运行代码。

你确定 procs [0] .MainWindowHandle 是正确的窗口句柄吗?

最后尝试使用SendMessage将消息直接发送到句柄。

答案 1 :(得分:1)

使用SendMessage实现(无需关注窗口)。

[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"));
        }
    }
}

参考:how-do-i-input-to-another-application

答案 2 :(得分:0)

对于你的问题,这里是技巧,

使用

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

此代码将密钥发送到任何应用程序。

将此代码放入timer_start() 在启动计时器之前添加一些延迟并在执行后停止计时器。

现在运行你的项目,它将启动计时器,在超时打开游戏之前等待按键!!

检查此链接,其中包含要发送的所有密钥及其代码 https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx