试图向游戏发送击键,但游戏无视

时间:2015-10-12 03:17:47

标签: c#

所以我知道这是一个在这个网站上已被触及的话题,这是另一个专门讨论它的问题。

我正在尝试向某个游戏发送击键,我相信游戏忽略了我的击键。我知道我已经找到了窗口,因为在我发送击键之前,我将游戏设置为前景,这是有效的。我已经尝试过SendKeys.Send,SendWait,我目前正在通过SendMessage尝试Windows API,但这也无法正常工作。我正在使用我在SO上通过其他用户找到的方法。以下是我正在使用的内容:

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

namespace KeySendTest2
{
    class Program
    {
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);



        public static void SendKeyStroke(IntPtr window, ushort key)
        {
            const uint WM_KEYDOWN = 0x100;
            const uint WM_KEYUP = 0x0101;

            SendMessage(window, WM_KEYDOWN, ((IntPtr)key), (IntPtr)0);
            SendMessage(window, WM_KEYUP, ((IntPtr)key), (IntPtr)0);
        }

        static void Main(string[] args)
        {
            IntPtr hWnd = FindWindow("the class here", null);
            SetForegroundWindow(hWnd);
            System.Threading.Thread.Sleep(3000);
            while (true)
            {
                SendKeyStroke(hWnd, (ushort)Keys.F3); // Doesn't work
                //SendKeys.SendWait(Keys.F3); -- Also doesn't work
            }
        }
    }
}

游戏是Windows应用程序,不是Web浏览器。有没有人有任何想法可以指出我为什么它可能忽略击键的正确方向?我知道可以这样做,因为游戏中有几个为游戏发送击键的实用程序,但它们不是开源的,所以我无法看到他们使用的是什么方法。

1 个答案:

答案 0 :(得分:0)

尽管有官方建议,许多游戏都没有使用消息循环进行输入。相反,他们使用折旧的DirectInput API或其他方式。

我已成功使用AutoITfrom C# code来实现此目的。