2

我想做一个游戏的宏程序。但是仅将密钥发送到游戏应用程序(游戏窗口)存在问题。我正在使用keybd_eventAPI 将密钥发送到游戏窗口。但是我只想在宏程序运行时将密钥发送到游戏窗口,而不是资源管理器或任何打开的窗口。当我更改 Windows 时,它仍在发送密钥。我尝试参考Interaction.App使用Visual Basic.dll。但Interaction.App只关注游戏窗口。

我找不到任何关于我的问题的信息。谁能帮我?谢谢

4

5 回答 5

2

我解决了我的问题。在这个领域里 ;

PostMessage(hWnd, WM_KEYDOWN, key, {必须给出密钥的 lParam} );

否则它不起作用。我们可以使用微软的 Spy++ 工具来控制 ChildWindow 类。

感谢大家的帮助。

于 2009-01-05T06:44:28.190 回答
1
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);
于 2009-01-02T16:06:17.933 回答
1

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
于 2009-01-02T15:31:10.983 回答
1

您是一直在检索窗口的句柄,还是在记住它?

如果您使用 FindWindow() API,您可以简单地存储句柄并使用 SendMessage API 手动发送键/鼠标事件。

于 2009-01-02T15:14:16.120 回答
0

如果您想与游戏通信,通常必须处理 DirectInput,而不是普通的键盘 API。

于 2009-01-02T15:26:28.013 回答