-1

メッセージを WM_COPYDATA に送信するための私の c# コーディング

public static bool SendArgs(IntPtr targetHWnd, string args)
        {
            Win32.CopyDataStruct cds = new Win32.CopyDataStruct();
            try
            {
                cds.cbData = (args.Length + 1) * 2;
                cds.lpData = Win32.LocalAlloc(0x40, cds.cbData);
                Marshal.Copy(args.ToCharArray(), 0, cds.lpData, args.Length);
                cds.dwData = (IntPtr)1;
                Win32.SendMessage(targetHWnd, Win32.WM_COPYDATA, IntPtr.Zero, ref cds);
            }
            finally
            {
                cds.Dispose();
            }

            return true;
        }

メッセージを受信するための私のCコードは

static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_COPYDATA:
          {

COPYDATASTRUCT* copy_data = (COPYDATASTRUCT*)(lParam);

            const char* str = (const char* )(copy_data->lpData);
            /* Also fixed the parameter list for "%.*s" */
    printf("Message (%u): %.*s\n", copy_data->dwData, (int)copy_data->cbData, str);
}
}
}

上記のコードを使用して、すべてのコンテンツではなく、メッセージの最初の文字を取得します

4

2 に答える 2

3

このようなことを意味しますか?

if (message == WM_COPYDATA)
{
    COPYDATASTRUCT* copy_data = (COPYDATASTRUCT)(lparam);

    const char* str = (const char*)(copy_data->lpData);

    /* Also fixed the parameter list for "%.*s" */
    printf("Message (%u): %.*s\n", copy_data->dwData, (int)copy_data->cbData, str);
}

もちろんcopy_data->lpData、文字列として印刷することは、それが実際に文字列データである場合にのみ意味があります。

于 2013-05-16T15:16:45.353 に答える
0

すべてのコンテンツではなく、メッセージの最初の文字を取得します。

これは、文字列が UTF-16 としてエンコードされていることを示しており、送信するデータが UTF-16 エンコードされているというメッセージを生成する C# コードから確認できます。

一方、C コードはそれを 8 ビット ANSI エンコードとして扱います。これが、C コードが正しく読み取れない理由です。C コードが UTF-16 として扱う場合は、すべてのコンテンツを取得できます。

文字列が null で終わると想定してはならず、cbDataバッファ オーバーランを避けるために使用する必要があります。

したがって、C コードを次のように変更できます。

COPYDATASTRUCT* cds = (COPYDATASTRUCT*)lParam;
int len = (cds->cbData/2)-1;
printf("Message (%u): %.*S\n", cds->dwData, len, cds->lpData);

%.*Sは入力を UTF-16 でエンコードされた文字列として扱い、最大文字数を出力することに注意してくださいlen

また、Microsoft のツールを使用していると仮定しています。これは、Sフォーマット タイプが非標準の Microsoft スペシャルであるためです。ポータブルにしたい場合は、それを行う方法がありますが、その問題に取り組む準備が整っているかどうかはわかりません.

于 2013-05-17T06:11:06.360 に答える