我想做一个游戏的宏程序。但是仅将密钥发送到游戏应用程序(游戏窗口)存在问题。我正在使用keybd_event
API 将密钥发送到游戏窗口。但是我只想在宏程序运行时将密钥发送到游戏窗口,而不是资源管理器或任何打开的窗口。当我更改 Windows 时,它仍在发送密钥。我尝试参考Interaction.App
使用Visual Basic.dll
。但Interaction.App
只关注游戏窗口。
我找不到任何关于我的问题的信息。谁能帮我?谢谢
我解决了我的问题。在这个领域里 ;
PostMessage(hWnd, WM_KEYDOWN, key, {必须给出密钥的 lParam} );
否则它不起作用。我们可以使用微软的 Spy++ 工具来控制 ChildWindow 类。
感谢大家的帮助。
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);
FindWindow API:
http ://www.pinvoke.net/default.aspx/user32.FindWindowEx
SendMessage API:
http ://www.pinvoke.net/default.aspx/user32/SendMessage.html
VB
Private Const WM_KEYDOWN As Integer = &H100
Private Const WM_KEYUP As Integer = &H101
C#
private static int WM_KEYDOWN = 0x100
private static int WM_KEYUP = 0x101
您是一直在检索窗口的句柄,还是在记住它?
如果您使用 FindWindow() API,您可以简单地存储句柄并使用 SendMessage API 手动发送键/鼠标事件。
如果您想与游戏通信,通常必须处理 DirectInput,而不是普通的键盘 API。