2013-03-29 37 views
1

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

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

问题:是否可以通过Postmessage()发送字符串和变量?如果是这样如何?

谢谢!对于C#我还是一个新手,并试图用一种更简单的语言来实现飞跃。 (Autoit)

回答

0

使用PostMessage不能在进程之间发送字符串。

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

即使对于使用SendMessage发送的同步消息,只有某些消息才会执行字符串编组。只有系统定义并设计用于携带字符串有效载荷的消息执行跨进程编组。即使如此,它只是旨在用于跨进程的消息。因此,您不能使用用户定义的消息来发送与SendMessage交叉处理的字符串。

您将需要找到一个更强大的IPC机制。或者逐字发送文字。

+0

好,吸。真的有什么方法可以实现吗?我会为每个发送一个按键,但一半的文本是一个未知的变量,直到程序运行并生成所需的字符串。感谢您及时的回复。 – cro91

0

如果你想发送的密钥(这是我所相信的发送确实在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); 

键码的名单可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

+0

是的。我已经明白了这一点,可以发送单独的按键,但是我需要发送的部分内容变成了一个我不知道的变量,直到进程运行。正在寻找一种发送类似的方法。感谢列表的键码虽然!我相信它会在某个地方派上用场。 – cro91

相关问题