C#使用PostMessage

时间:2011-08-03 13:45:02

标签: c# .net sendkeys user32 postmessage

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

这是我的代码:

[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 个答案:

答案 0 :(得分:1)

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

看到这个类似的问题:

Send Key Strokes to Games

答案 1 :(得分:0)

程序员通常会对KeyUp事件做出反应,而不是对事件做出反应;你尝试发送WM_KEYUP吗?

答案 2 :(得分:0)

你不能伪造这样的信息,并期望它能够可靠地工作 - 你所做的只是发送信息,没什么特别的。

这意味着如果目标程序以不同的方式测试输入(例如通过直接检查键状态,对不同的消息做出反应或仅使用完全不同的机制),目标程序最好可能完全忽略你的输入,最糟糕的是完全混淆。

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

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

答案 3 :(得分:0)

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

有关详细信息,请参阅this博文。