public static extern uint SendMessage(IntPtr hWnd, int unMsg

本文关键字:hWnd int unMsg IntPtr static extern uint SendMessage public | 更新日期: 2023-09-27 18:10:05

我的代码如下

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern uint SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam, 
    IntPtr lParam);

Fxcop错误:"正如在你的代码中声明的那样,p/Invoke 'SendMessage(IntPtr, int, IntPtr, IntPtr)'的返回类型将在64位平台上为4字节宽。这是不正确的,因为这个API的实际本机声明表明它在64位平台上应该是8字节宽。请参阅MSDN平台SDK文档,以帮助确定应该使用什么数据类型而不是' int'"

所以要修复上述错误,我需要改变返回类型UIntPtr吗?

请帮我解决这个问题,并给我一个合理的理由。

谢谢,VMG

public static extern uint SendMessage(IntPtr hWnd, int unMsg

消息正确。该函数返回LRESULT,这是一个有符号的指针大小类型。所以在c#中你应该使用IntPtr

严格地说,消息参数是无符号的,WPARAM是无符号的,LPARAM是有符号的,所以如果您希望效仿,那么您将有:

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

这些信息都是文档化的:

  • SendMessage
  • Windows数据类型

然而,因为SendMessage是一种适合所有类型的函数,所以不值得在有符号和无符号类型上过于纠结。不同的消息使用强制类型转换对参数进行不同的处理。因此,请随意使用最方便的类型,但它们必须具有正确的大小。