如何将WinDef.POINT转换为WinDef.POINT.ByValue类型?
解决方案
你遇到的是JNA库中结构体按值/按引用传递的类型适配问题,可按以下步骤处理:
- 首先明确
WinDef.POINT默认是按引用传递的类型(本质是ByReference子类),而GetCursorPos本身要求传入指针类型的POINT对象接收输出值,所以你首先拿到的普通POINT对象是符合GetCursorPos调用要求的。 - 要转成
WinDef.POINT.ByValue类型只需要手动赋值坐标即可,无需额外复杂操作:
// 第一步:获取光标坐标 WinDef.POINT cursorPoint = new WinDef.POINT(); User32.INSTANCE.GetCursorPos(cursorPoint); // 第二步:构造ByValue实例并赋值 WinDef.POINT.ByValue pointByVal = new WinDef.POINT.ByValue(); pointByVal.x = cursorPoint.x; pointByVal.y = cursorPoint.y; // 第三步:直接将pointByVal传入要求ByValue类型参数的函数即可
- 如果你的JNA版本中
WinDef.POINT.ByValue提供了带x、y参数的构造方法,也可以直接简化成一行构造:
WinDef.POINT.ByValue pointByVal = new WinDef.POINT.ByValue(cursorPoint.x, cursorPoint.y);
注意:不能直接将普通
WinDef.POINT对象强转为WinDef.POINT.ByValue类型,否则会抛出类型转换异常,必须显式构造新的ByValue实例赋值。
内容的提问来源于stack exchange,提问作者vbyzjnlehi
相关产品推荐
相关产品推荐

