我有一个用Autoit编写的脚本,我正在尝试将其转换为C#,以便在其中提供更多功能。它最终具有的主要功能是将文本发送到命令(游戏内文本)到我打开的游戏。我想要做的是在Autoit中获得Send()函数的相同功能。
我一直在阅读并得出结论,Postmessage和Sendmessage是最好的,因为他们能够将它发送到当前不活动的窗口。有没有办法用PostMessage发送蜇?我试图使用Sendmessage,当它向游戏发送按键时,其中一些没有被接受,但发布消息似乎让它们正常工作。
问题:是否可以使用Postmessage()发送字符串和变量?如果是这样的话?
谢谢!我还是C#的新手,并尝试用简单的语言实现跨越。 (AutoIt的)
答案 0 :(得分:0)
您无法使用PostMessage
在进程之间发送字符串。
因为您尝试跨进程边界发送文本,所以需要将该文本从发送方进程编组到接收方进程。这将涉及在接收进程的堆上分配一个字符串。因为消息是异步传递的,所以需要有一种机制让消息的接收者释放该编组的字符串。但是不存在这样的机制。
即使对于SendMessage
传递的同步消息,也只有某些消息执行字符串编组。只有系统定义并设计用于承载字符串有效负载的消息才能执行跨进程编组。即便如此,它只是旨在跨进程使用的消息。因此,您无法使用用户定义的消息来发送与SendMessage
交叉处理的字符串。
您需要找到更强大的IPC机制。或者按字符发送文字。
答案 1 :(得分: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);
可在此处找到KeyCodes列表:http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx