如何将IntPtr转换为int

时间:2013-08-11 14:57:00

标签: c# window-handles

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

3 个答案:

答案 0 :(得分:10)

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到“某事”是对某事的托管引用,因此在传递给Native API时它们会在内部转换为IntPtr。因此,从Native API的角度来看,out uint相当于IntPtr

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

请注意,某些类型(如boolchar)由封送程序进行特殊处理。

您不应该将int转换为IntPtr。保持IntPtr并过得开心。如果必须使IntPtr不支持某些数学运算,请使用long(它是64位,所以在我们将 Windows 128 之前,不会有任何问题:-))。

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

答案 1 :(得分:1)

我认为错误cannot implicitly convert from uint to int是指=语句。字段this.ProcessIDint,但GetWindowThreadProcessId返回uint

试试这个

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

答案 2 :(得分:0)

无论何时,我都会得到“算术运算导致溢出”:

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