如何将IntPtr转换为int

15

窗口句柄有时是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


7
windowHandle.ToInt32()会起作用。 - H H
@Henk holterman 我编辑了问题,但仍然无法编译。 - E Mett
2
你不应该编辑掉问题的关键部分,可以添加下一节。 - H H
2
请检查您的this.ProcessID声明。 - H H
3个回答

14

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);
在这种情况下,对于“something”的refout是对其进行管理的引用,因此在传递给Native API时会被内部转换为IntPtr。因此,从Native API的角度来看,out uint等同于IntPtr

解释:重要的是参数的“长度”是正确的。对于所调用的API,intuint是相等的。而32位的IntPtr也是相同的。

请注意,一些类型(如boolchar)由编组程序具有特殊处理方式。

您永远不应该将int转换为IntPtr。请将其保留为IntPtr并保持愉快。如果必须执行一些IntPtr不支持的数学运算,则可使用long(它是64位的,因此在我们拥有Windows 128之前,不会有任何问题 :-))。

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

2

我认为错误“无法从uint隐式转换为int”指的是“=”语句。字段this.ProcessIDint类型,但GetWindowThreadProcessId返回uint类型。

请尝试以下操作:

this.ProcessID = unchecked((int)GetWindowThreadProcessId(windowHandle.ToInt32(),0))

1
每当我进行以下操作时,都会收到“算术运算导致溢出”的错误提示:
IntPtr handler = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
if (handler.ToInt32() == 0) //throws Exception

而不是那个:

IntPtr handler = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE);
if (handler == IntPtr.Zero) //OK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接