C# 向游戏窗口发送键盘宏命令
我想做一个游戏的宏程序。但只向游戏应用程序(游戏窗口)发送密钥存在问题。我正在使用C# 向游戏窗口发送键盘宏命令,c#,api,keyboard,sendkeys,C#,Api,Keyboard,Sendkeys,我想做一个游戏的宏程序。但只向游戏应用程序(游戏窗口)发送密钥存在问题。我正在使用keybd_eventAPI向游戏窗口发送密钥。但我只想在宏程序运行时将密钥发送到游戏窗口,而不想发送到资源管理器或任何打开的窗口。当我换了窗户,它仍然在发送钥匙。我尝试将Interaction.App与visualbasic.dll引用一起使用。但是Interaction.App只关注游戏窗口 我找不到关于我的问题的任何东西。有人能帮我吗?Thanx您是一直在检索窗口的句柄,还是记住了它 如果使用FindWind
keybd_event
API向游戏窗口发送密钥。但我只想在宏程序运行时将密钥发送到游戏窗口,而不想发送到资源管理器或任何打开的窗口。当我换了窗户,它仍然在发送钥匙。我尝试将Interaction.App
与visualbasic.dll
引用一起使用。但是Interaction.App
只关注游戏窗口
我找不到关于我的问题的任何东西。有人能帮我吗?Thanx您是一直在检索窗口的句柄,还是记住了它
如果使用FindWindow()API,您只需存储句柄并使用SendMessage API手动发送按键/鼠标事件。如果您想与游戏进行通信,通常必须处理DirectInput,而不是普通键盘API。FindWindow API:
SendMessage API:
VB C# 呼叫码
var hWnd = SendKeySample.FindWindow("Untitled - Notepad");
var editBox = SendKeySample.FindWindow(hWnd, "edit");
SendKeySample.SendKey(editBox, Keys.A);
我解决了我的问题。
在这个领域
PostMessage(hWnd,WM_KEYDOWN,key,{必须给出key的lParam})
另外,我们可以使用微软的Spy++工具来控制ChildWindow类
感谢大家的帮助。完全同意这一点,但他似乎已经在使用键盘事件api,并且只有在窗口失去焦点时才会出现问题。不一定-普通键盘api的级别低于DirectInput,虽然使用DirectInput可能更简单,但两种方法都应该可以。
private static int WM_KEYDOWN = 0x100
private static int WM_KEYUP = 0x101
class SendKeySample
{
private static Int32 WM_KEYDOWN = 0x100;
private static Int32 WM_KEYUP = 0x101;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
public static IntPtr FindWindow(string windowName)
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.MainWindowHandle != IntPtr.Zero && p.MainWindowTitle.ToLower() == windowName.ToLower())
return p.MainWindowHandle;
}
return IntPtr.Zero;
}
public static IntPtr FindWindow(IntPtr parent, string childClassName)
{
return FindWindowEx(parent, IntPtr.Zero, childClassName, string.Empty);
}
public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key)
{
PostMessage(hWnd, WM_KEYDOWN, key, 0);
}
}
var hWnd = SendKeySample.FindWindow("Untitled - Notepad");
var editBox = SendKeySample.FindWindow(hWnd, "edit");
SendKeySample.SendKey(editBox, Keys.A);