所以我知道这是一个在这个网站上已被触及的话题,这是另一个专门讨论它的问题。
我正在尝试向某个游戏发送击键,我相信游戏忽略了我的击键。我知道我已经找到了窗口,因为在我发送击键之前,我将游戏设置为前景,这是有效的。我已经尝试过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浏览器。有没有人有任何想法可以指出我为什么它可能忽略击键的正确方向?我知道可以这样做,因为游戏中有几个为游戏发送击键的实用程序,但它们不是开源的,所以我无法看到他们使用的是什么方法。
答案 0 :(得分:0)
尽管有官方建议,许多游戏都没有使用消息循环进行输入。相反,他们使用折旧的DirectInput API或其他方式。
我已成功使用AutoIT库from C# code来实现此目的。