新物网

当前位置:首页 > 百科

百科

WParam溢出处理X64应用程序中的难题

时间:2023-10-15 12:13:36 静子
C#AnyCPU的应用程序在解决鼠标中键WM_MOUSEWHEL代码中溢出问题的Overflowexception。在X86环境中,var wParam = (int)msg.WParam;工作得很好。在X64环境中,快速翻转滚轴会有msg.WParam 当转换为int时,外溢,(WPa

C#AnyCPU的应用程序在解决鼠标中键WM_MOUSEWHEL代码中溢出问题的Overflowexception。

在X86环境中,

var wParam = (int)msg.WParam;

工作得很好。

在X64环境中

快速翻转滚轴会有msg.WParam 当转换为int时,外溢,(WParam=4263510016)。

信息为:

Systemem没有处理.OverflowException
  Message=逻辑操作导致溢出。
  Source=mscorlib
  StackTrace:
       在 System.IntPtr.op_Explicit(IntPtr value)
       在 TIM.MouseWheelHandler.MouseWheelMessageFilter.PreFilterMessage(Message& m) 部位。。。。

验证WParam的IntPtram,MSDN说

IntPtr 类型设计成整数,其尺寸适用于特殊服务平台。也就是说,这种类型的案例是 32 位置硬件和计算机操作系统 32 位,在 64 位置硬件和计算机操作系统 64 位。

因此,应给出上述编码:

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