Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向游戏窗口发送键盘宏命令_C#_Api_Keyboard_Sendkeys - Fatal编程技术网

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);