我需要将一个字符串从 C# 发送到 C++ WindowProc。与此相关的 SO 上有许多相关问题,但没有一个答案对我有用。这是情况:

PInvoke:
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, string lParam);

C#:
string lparam = "abc";
NativeMethods.User32.SendMessage(handle, ConnectMsg, IntPtr.Zero, lparam);

C++:
API LRESULT CALLBACK HookProc (int code, WPARAM wParam, LPARAM lParam)
{
    if (code >= 0)
    {
        CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
                ...
        (LPWSTR)cwp->lParam   <-- BadPtr
                ...
    }

    return ::CallNextHookEx(0, code, wParam, lParam);
}

我尝试了许多不同的方法,将字符串编码为 LPStr、LPWStr,还尝试从非托管内存创建一个 IntPtr,并使用 Marshal.WriteByte 写入它。

指针是 C++ 端的正确内存位置,但数据不存在。我错过了什么?

最佳答案

对于 C++ LPWSTRLPSTR 参数,您需要在 DllImport 中使用 C# StringBuilder

对于 C++ LPCWSTRLPCSTR 参数,您需要在 DllImport 中使用 C# string

关于C# SendMessage 到 C++ WinProc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2653658/

10-10 18:01