The SendMessage
签名是
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
or this
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
不交换int
and IntPtr
。它们仅在 32 位上几乎相同(大小相同)。在 64 位IntPtr
几乎相当于long
(大小相等)
The GetWindowThreadProcessId
签名是
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
or
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
在这种情况下,一个ref
or a out
到“某物”是对某物的托管引用,因此它们在内部转换为IntPtr
当传递给本机 API 时。所以out uint
从 Native API 的角度来看,相当于IntPtr
.
说明:重要的是参数的“长度”是否正确。int
and uint
对于被调用的 API 来说是相等的。还有一个32位的IntPtr
也是一样。
请注意,某些类型(例如bool
and char
)由封送拆收器进行特殊处理。
你不应该永远转换int
to an IntPtr
。保留它作为IntPtr
并快乐地生活。如果您必须进行一些不支持的数学运算IntPtr
, use long
(它是 64 位的,所以直到我们有视窗128,不会有任何问题:-))。
IntPtr p = ...
long l = (long)p;
p = (IntPtr)l;