所以我遇到了一个问题,我正在尝试将密钥发送到游戏中,并在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的游戏并且我已经设置了但仍然没有结果......任何可以指出我正确方向的人?
答案 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"));
}
}
}
答案 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