【发布时间】:2018-08-02 01:59:54
【问题描述】:
我想通过在单击 Ctrl 按钮并移动鼠标滚轮时禁用缩放来覆盖控件中的某些功能。这在 32 位进程上运行良好,但在 64 位进程上,我通过将 IntPtr 转换为 Int32 得到溢出。我怎样才能重新设计它以使其适用于 32 位和 64 位进程?我不能将按位运算符与 IntPtrs 一起使用。
是否应该将我的常量设置为 long,然后执行 IntPtr.ToInt64()?这在 32 位和 64 位进程上都能正常工作吗?如果我做出这样的改变,有什么需要担心的吗?
private const int WM_MOUSEWHEEL = 0x020A;
private const int MK_CONTROL = 0x0008;
//Prevent CTRL+Mouse Wheel from Zooming
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_MOUSEWHEEL)
{
if ((m.WParam.ToInt32() & MK_CONTROL) != 0)
{
// Ignore CTRL+WHEEL
return;
}
}
base.WndProc(ref m);
}
【问题讨论】:
-
如果您有一个 64 位指针(在 64 位进程上),您希望
ToInt32准确做什么? -
@mjwills:一些消息参数是
IntPtr,使它们大到足以承载指针,但根据消息ID,它们实际上并不是指针。问题似乎与存储在这些指针大小的字段之一中的小数值有关。
标签: c# winforms bitwise-operators wndproc intptr