C# 使用 PostMessage

Posted

技术标签:

【中文标题】C# 使用 PostMessage【英文标题】:C# Using PostMessage 【发布时间】:2011-10-19 03:18:26 【问题描述】:

我正在尝试向应用程序发送密钥。我测试了使用断点的 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 应用程序?它应该只发送到我的应用程序。

【问题讨论】:

Simulating Key Press c#的可能重复 【参考方案1】:

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

看到这个类似的问题:

Send Key Strokes to Games

【讨论】:

哇,这对我来说真的太多了,我的技能并不高。在 C# 中挂钩 API 对我来说太难了。无论如何,非常感谢我一直理解它!【参考方案2】:

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

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

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

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

You can't simulate keyboard input with PostMessage Simulating input via WM_CHAR messages may fake out the recipient but it won't fake out the input system

【讨论】:

我也通过 WM_CHAR 试过了,还是不行。就像我说的,当我打开游戏内的聊天时,我可以在里面写上类似的光标。 @Noli 试试 SendInput(我猜你需要将游戏设置为前台窗口) 你能不能这么好,帮帮我。我不明白 Sendinput,它要复杂得多,不仅仅是键盘输入,而且我没有找到在特定句柄上使用它的方法。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

SendInput 要求窗口处于活动状态。

以上是关于C# 使用 PostMessage的主要内容,如果未能解决你的问题,请参考以下文章

创建可以从 c# 和 c++ 中使用的 c# dll

如何使用 C# GUI 调用 C# 控制台应用程序 [重复]

使用 C# 从 RLM 读取许可证文件(C++ 到 C# 的翻译)

如何在 C# 的泛型中使用扩展

使用托管 C++ 项目中的 C# 类

c#脚本中使用c#方法