C#應(yīng)用程序是AnyCPU的,在一段處理鼠標(biāo)滾輪WM_MOUSEWHEEL的代碼里碰到溢出的問(wèn)題OverflowException。
在X86的環(huán)境下,
var wParam = (int)msg.WParam;
工作得很好。
在X64的環(huán)境下,
快速滾動(dòng)滾輪會(huì)出現(xiàn)msg.WParam 轉(zhuǎn)換為int的時(shí)候溢出,(WParam=4263510016)。
信息為:
未處理System.OverflowException
Message=算術(shù)運(yùn)算導(dǎo)致溢出。
Source=mscorlib
StackTrace:
在 System.IntPtr.op_Explicit(IntPtr value)
在 TIM.MouseWheelHandler.MouseWheelMessageFilter.PreFilterMessage(Message& m) 位置。。。
查證WParam是IntPtr,MSDN說(shuō)
IntPtr 類型被設(shè)計(jì)成整數(shù),其大小適用于特定平臺(tái)。即是說(shuō),此類型的實(shí)例在 32 位硬件和操作系統(tǒng)中將是 32 位,在 64 位硬件和操作系統(tǒng)上將是 64 位。
所以,上面的代碼應(yīng)該為:
var wParam = (IntPtr.Size == 8) ? (int)((long)msg.WParam << 32 >> 32) : (int)msg.WParam;
測(cè)試通過(guò)。