解决C# X64应用程序中读取WParam溢出的问题
程序员文章站
2023-12-17 09:00:52
在x86的环境下,
var wparam = (int)msg.wparam;
工作得很好。
在x64的环境下,
快速滚动滚轮会出现msg.wparam 转换为in...
在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;
测试通过。