【问题标题】:sending String from C# to MFC through SendMessage通过 SendMessage 将字符串从 C# 发送到 MFC
【发布时间】:2012-05-11 17:50:00
【问题描述】:

我知道如何通过使用 LPCTSTR 来 PInvoke 一个需要 CString 的方法,并设置 DllImport 以使用 LPstr 转换进行调用。

但是,如果使用 LPARAM 是 IntPtr 的 SendMessage,我该如何处理?

这行得通吗?

    [DllImport("user32.dll", CharSet = CharSet.Ansi)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, 
        [MarshalAs(UnmanagedType.LPStr)] String lParam);

【问题讨论】:

  • 最简单的解决方案是将 LPARAM 声明为 String :-)
  • 为什么不直接使用IntPtr
  • @CodyGray 那么创建另一个 DllImport 方法?
  • @scottm 我想我可以编组为本机字节,但我希望 UnmanagedType.LPStr 更简单
  • 是的,您可以重载 P/Invoke 签名。你是对的,有一种方法可以通过编组来实现,但这稍微复杂一些。

标签: c# mfc pinvoke


【解决方案1】:

您可以像这样简单地声明它:

[DllImport("user32.dll", SetLastError=true)]
static extern IntPtr SendMessage(
    IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);

默认编组是作为指向以空字符结尾的字符数组的指针。如果您真的想要 ANSI 版本,那么这是默认设置。并且你应该使用SetLastError,以防你想在失败的情况下捕获错误代码。

我相信您知道,如果窗口处于不同的进程中,它将无法工作。

【讨论】:

  • 快速提问,当调用 WndProc 时,lParam 始终是 IntPtr。如何从 lParam 中获取字符串值?
  • Marshal.PtrToStringAnsiMarshal.PtrToStringUni
  • 谢谢大卫。我正在使用你的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多