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# GUI 调用 C# 控制台应用程序 [重复]