作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
窗口句柄有时是 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);
不要交换 int
和 IntPtr
。它们仅在 32 位(大小相等)时几乎等效。在 64 位,IntPtr
几乎等同于 long
(大小相等)
GetWindowThreadProcessId
签名是
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
或
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
在这种情况下,“某物”的 ref
或 out
是对某物的托管引用,因此它们在内部转换为 IntPtr
当传递给 native API 时。因此,从 Native API 的角度来看,out uint
等同于 IntPtr
。
说明:重要的是参数的“长度”是正确的。 int
和 uint
对于被调用的 API 是相等的。 32 位的 IntPtr
也是一样的。
请注意,某些类型(如 bool
和 char
)由编码(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/
我是一名优秀的程序员,十分优秀!