zl程序教程

您现在的位置是:首页 >  后端

当前栏目

解决C#X64应用程序中读取WParam溢出的问题

c#应用程序 问题 解决 读取 溢出 X64
2023-06-13 09:14:49 时间

在X86的环境下,

varwParam=(int)msg.WParam;

工作得很好。

在X64的环境下,

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

信息为:

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

查证WParam是IntPtr,MSDN说

IntPtr类型被设计成整数,其大小适用于特定平台。即是说,此类型的实例在32位硬件和操作系统中将是32位,在64位硬件和操作系统上将是64位。

所以,上面的代码应该为:

varwParam=(IntPtr.Size==8)?(int)((long)msg.WParam<<32>>32):(int)msg.WParam;

测试通过。