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