2013-03-29 73 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

相關問題