5

これが私のプロトタイプです:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool PostMessage(int hhwnd, uint msg, IntPtr wparam, IntPtr lparam);

そして、これが私がそれを使用している方法です:

PostMessage(HWND_BROADCAST, msg, Marshal.StringToHGlobalAuto("bob"), IntPtr.Zero);

別のスレッドでこのメッセージをインターセプトできますが、次を使用してボブを取り戻そうとすると:

string str = Marshal.PtrToStringAuto(m.WParam); // where m = the Message object

私はstrでボブを取得しません。

これは、あるスレッドのスタックで「bob」文字列を参照し、その参照が別のスレッドのスタックではまったく意味をなさないという事実によるものだと考えています。しかし、その場合、これらの wparam および lparam ポインターは、同じスレッドで渡されるメッセージに対してのみ実際に使用されますか?

編集* 訂正: スレッドとは、プロセスを意味します。これは、スレッドではなく、プロセス間で文字列を渡す際の問題です。

4

2 に答える 2

2

最後の質問に答えるために。私は同じことを試しましたが、同じウィンドウでlParamを文字列に変換して逆方向に変換しようとすると、非常に穏やかに動作しますが、別のウィンドウに渡すときはそうではありません。そのため、代わりに SendMessage を使用しようとしましたが、うまくいきました。

http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/

このクラスをダウンロードしたところ、非常にうまく機能しました。:)

次のように使用します。

    public void SendMsg(string msg)
{
    MessageHelper msgHelper = new MessageHelper();
    int hWnd = msgHelper.getWindowId(null, "The title of the form you want to send a message to");
    int result = msgHelper.sendWindowsStringMessage(hWnd, 0, msg);
    //Or for an integer message
    result = msgHelper.sendWindowsMessage(hWnd, MessageHelper.WM_USER, 123, 456);
}

//In your form window where you want to receive the message

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case MessageHelper.WM_USER:
            MessageBox.Show("Message recieved: " + m.WParam + " - " + m.LParam);
            break;
        case MessageHelper.WM_COPYDATA:
            MessageHelper.COPYDATASTRUCT mystr = new MessageHelper.COPYDATASTRUCT();
            Type mytype = mystr.GetType();
            mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
            MessageBox.Show(mystr.lpData);
            break;
    }
    base.WndProc(ref m);
}
于 2012-01-31T10:03:28.267 に答える
1

HGLOBAL は、もはやグローバルではありません。win16以降ではありません。HWND_BROADCAST は、メッセージを別のプロセスに送信しているように見えますが、別のスレッドだけを気にする必要はありません。

したがって、OS がマーシャリングする方法を知っている標準メッセージのいずれかを使用しない限り、さまざまなプロセスがアクセスできる共有メモリ領域に文字列 "bob" を配置する必要があります。

于 2010-01-14T18:58:24.807 に答える