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应用程序?它应该只发送到我的应用。
如果我理解正确的话,你是想向游戏发送密钥。在这种情况下,我认为游戏不是从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来模拟输入到另一个窗口。