C# Using PostMessage

本文关键字:PostMessage Using | 更新日期: 2023-09-27 18:04:28

我正在尝试向应用程序发送密钥。我测试了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);
            }

    }

就像我说的,它可以成功发送100万次,但什么也没有发生。是否有其他方法可以将密钥发送到最小化甚至隐藏的Windows应用程序?它应该只发送到我的应用。

C# Using PostMessage

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

参见这个类似的问题:

向游戏发送按键

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

这意味着,如果目标程序以不同的方式测试输入(例如,直接检查键状态,对不同的消息作出反应,或者只是使用完全不同的机制),目标程序最好的情况是完全忽略您的输入,最坏的情况是完全混淆。

使用SendInput函数代替(我不确定这是否暴露为。net框架的一部分)。

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

  • PostMessage
  • 不能模拟键盘输入
  • 通过WM_CHAR消息模拟输入可能会伪造出接收者,但不会伪造出输入系统

请注意PostMessage的正确导入是:

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

像你这样发送密钥可能不起作用,但是你可以使用spy++来捕获由windows发送到应用程序的实际消息并使用它们。

https://learn.microsoft.com/en - us/visualstudio/debugger/introducing间谍increment?view=vs - 2022

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

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