1

我有一个用 Autoit 编写的脚本,我正在尝试将其转换为 C#,以便在以后拥有更多功能。它最终具有的主要功能是将文本发送到我打开的游戏的命令(游戏内文本)。我想要做的是在 Autoit 中获得与 Send() 函数相同的功能。

我一直在阅读并得出结论,Postmessage 和 Sendmessage 将是最好的,因为它们能够将其发送到当前未激活的窗口。有没有办法用 PostMessage 发送刺痛信息?我尝试使用 Sendmessage,当它向游戏发送按键时,其中一些按键未被接受,但发布消息似乎让它们正常工作。

问题:是否可以使用 Postmessage() 发送字符串和变量?如果有怎么办?

谢谢!我还是 C# 的新手,并试图从一种更简单的语言中实现飞跃。(自动)

4

2 回答 2

0

如果您想发送密钥(我相信 Send 在 Autoit 中就是这样做的),您需要发送 WM_KEYDOWN 消息并将虚拟密钥作为 wParam 发送:

const UInt32 WM_KEYDOWN = 0x0100;
const int VK_A = 0x41;

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

然后要使用它,您需要窗口句柄:

var windowHandle = System.Diagnostics.Process.GetProcessesByName("someprocess")[0].Handle;
PostMessage(windowHandle, WM_KEYDOWN, VK_A, 0);

可以在此处找到 KeyCode 列表:http: //msdn.microsoft.com/en-us/library/windows/desktop/dd375731 (v=vs.85).aspx

于 2013-03-29T17:29:21.793 回答
0

您不能使用PostMessage.

因为您正在尝试跨进程边界发送文本,所以需要将该文本从发送者的进程编组到接收者的进程。这将涉及在接收进程的堆上分配一个字符串。因为消息是异步传递的,所以需要一种机制让消息的接收者释放该编组的字符串。但不存在这样的机制。

即使对于使用 传递的同步消息SendMessage,也只有某些消息执行字符串编组。只有由系统定义并设计用于携带字符串有效负载的消息才能执行跨进程编组。即便如此,也只是打算跨进程使用的消息。因此,您不能使用用户定义的消息来跨进程发送字符串SendMessage

您将需要找到功能更强大的 IPC 机制。或逐个字符发送文本。

于 2013-03-29T17:19:48.330 回答