2

我正在尝试向应用程序发送密钥。我测试了使用断点的 Handlewindow 值以了解我在做什么,但我找不到解决方案。更详细地说,它是一个小游戏,当我激活游戏中的聊天栏时,我要发送的密钥将写在那里,但我想让它在我玩游戏时使用命令。游戏没有后卫或一些保护措施。

这是我的代码:

[DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    const uint WM_KEYDOWN = 0x0100;

    private void button1_Click(object sender, EventArgs e)
    {
        string pName = textBox1.Text;


        //Get Processes
        Process[] processes = Process.GetProcessesByName(pName);

        //Main part
        foreach (Process p in processes)
            if (p.ProcessName == (string)pName)
            {
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.W, 0);
            }


    }

就像我说的,它可以成功发送 1000000 次,但没有任何反应。是否有另一种方法可以将密钥发送到最小化甚至隐藏的 Windows 应用程序?它应该只发送到我的应用程序。

4

4 回答 4

1

您不能像这样伪造消息并期望它可靠地工作 - 您所做的只是发送消息,没有什么花哨的。

这意味着如果目标程序以不同的方式测试输入(例如通过直接检查键状态、对不同的消息做出反应或只是使用完全不同的机制),目标程序最多可能只是完全忽略您的输入并且最坏的情况是完全糊涂。

请改用SendInput函数(我不确定这是否作为 .Net 框架的一部分公开)。

一些相当相关的有趣博客文章:

于 2011-08-03T13:47:41.937 回答
1

如果我理解正确,您想将密钥发送到游戏。在这种情况下,我认为游戏没有从 Windows 消息队列中获取键,它可能是直接使用 DirectX 或类似方式读取键盘状态。

看到这个类似的问题:

向游戏发送击键

于 2011-08-03T13:48:59.463 回答
0

程序员通常会对KeyUp事件做出反应而不是沮丧;您是否尝试发送 WM_KEYUP?

于 2011-08-03T13:46:53.760 回答
0

您应该使用SendInput模拟输入到另一个窗口。

有关更多详细信息,请参阅博客文章。

于 2011-08-03T13:48:40.440 回答