hongyanjava 2016-05-26 15:14 采纳率: 0%
浏览 1809
已结题

在x64应用程序中,PostMessage读取WParam溢出的问题的解决方案是什么?

在x64应用程序中,使用PostMessage(HWNDhWnd,UINTMsg,WPARAM wParam,LPARAM lParam)时,第三个参数(WPARAM)在读取的时候,经常会报一个这样的错误:
未处理System.OverflowException Message=算术运算导致溢出。 Source=mscorlib StackTrace: 在 System.IntPtr.op_Explicit(IntPtr value) 在 TIM.MouseWheelHandler.MouseWheelMessageFilter.PreFilterMessage(Message& m) 位置。。。

如何在C++/C#中解决这个问题?

网上有一个这样的解决方案,但是我不能理解“(int)((long)msg.WParam << 32 >> 32)”是什么意思,如何改动一下才能在C++/C#代码中使用?

=================网上的解决方案====================

在X86的环境下,var wParam = (int)msg.WParam;工作得很好。

在X64的环境下,快速滚动滚轮会出现msg.WParam 转换为int的时候溢出,(WParam=4263510016)。

信息为:未处理System.OverflowException Message=算术运算导致溢出。 Source=mscorlib StackTrace: 在 System.IntPtr.op_Explicit(IntPtr value) 在 TIM.MouseWheelHandler.MouseWheelMessageFilter.PreFilterMessage(Message& m) 位置。。。

查证WParam是IntPtr,MSDN说IntPtr 类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在 32 位硬件和操作系统中将是 32 位,在 64 位硬件和操作系统上将是 64 位。
所以,上面的代码应该为:var wParam = (IntPtr.Size == 8) ? (int)((long)msg.WParam << 32 >> 32) : (int)msg.WParam;

测试通过。
===================网上的解决方案=====================

上面的解决方案,我放到自己的C++代码中根本无法使用,请大家帮帮忙,谢谢。再次问一下:“msg.WParam << 32 >> 32” 这个代码是什么意思啊?

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-05-26 15:17
    关注

    不要用int,用long或者uint

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?