gpt4 book ai didi

c# - 如何将 IntPtr 转换为 int

转载 作者:可可西里 更新时间:2023-11-01 09:07:25 25 4
gpt4 key购买 nike

窗口句柄有时是 int 类型,有时是 IntPtr

int 示例:

 [DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);

IntPtr 示例:

  [DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);

我似乎无法从一个转换/转换为另一个。

当我尝试 this.ProcessID = GetWindowThreadProcessId(windowHandle.ToInt32(),0) 时出现错误 cannot implicitly convert from uint to int

最佳答案

SendMessage 签名是

static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

或者这个

static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);

不要交换 intIntPtr。它们仅在 32 位(大小相等)时几乎等效。在 64 位,IntPtr 几乎等同于 long(大小相等)

GetWindowThreadProcessId 签名是

static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

在这种情况下,“某物”的 refout 是对某物的托管引用,因此它们在内部转换为 IntPtr当传递给 native API 时。因此,从 Native API 的角度来看,out uint 等同于 IntPtr

说明:重要的是参数的“长度”是正确的。 intuint 对于被调用的 API 是相等的。 32 位的 IntPtr 也是一样的。

请注意,某些类型(如 boolchar)由编码(marshal)拆收器进行特殊处理。

您不应该将 int 转换为 IntPtr。将其保留为 IntPtr 并快乐地生活。如果您必须进行一些 IntPtr 不支持的数学运算,请使用 long(它是 64 位,所以在我们拥有 Windows 128 之前,有不会有任何问题:-))。

IntPtr p = ...
long l = (long)p;
p = (IntPtr)l;

关于c# - 如何将 IntPtr 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com