1

私はAutoitで書かれたスクリプトを持っています.C#に変換して、将来的により多くの機能を持たせようとしています。最終的に持つ主な機能は、開いているゲームにコマンド (ゲーム内テキスト) にテキストを送信することです。私がやろうとしているのは、Autoit の Send() 関数と同じ種類の機能を取得することです。

私は読んでいて、現在アクティブでないウィンドウに送信できるため、Postmessage と Sendmessage が最適であるという結論に達しました。PostMessage で文字列を送信する方法はありますか? Sendmessage を使用しようとしましたが、キー プレスをゲームに送信しているときに、キー プレスの一部が受け入れられませんでしたが、ポスト メッセージでは機能しているようです。

質問: Postmessage() で文字列や変数を送信することはできますか? もしそうなら、どのように?

ありがとう!私はまだ C# に不慣れで、より単純な言語から飛躍しようとしています。(オートイット)

4

2 に答える 2

0

を使用してプロセス間で文字列を送信することはできませんPostMessage

プロセスの境界を越えてテキストを送信しようとしているため、そのテキストを送信側のプロセスから受信側のプロセスにマーシャリングする必要があります。これには、受信プロセスのヒープに文字列を割り当てる必要があります。メッセージは非同期で配信されるため、メッセージの受信者がマーシャリングされた文字列を解放するためのメカニズムが必要になります。しかし、そのようなメカニズムは存在しません。

で配信される同期メッセージであっても、SendMessage特定のメッセージのみが文字列マーシャリングを実行します。システムによって定義され、文字列ペイロードを運ぶように設計されたメッセージのみが、クロスプロセス マーシャリングを実行します。それでも、クロスプロセスで使用されることを意図しているのはメッセージだけです。したがって、ユーザー定義のメッセージを使用して、 とクロスプロセスで文字列を送信することはできませんSendMessage

より有能な IPC メカニズムを見つける必要があります。または、テキストを 1 文字ずつ送信します。

于 2013-03-29T17:19:48.330 に答える
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 に答える