具有按位运算符的IntPtr.ToInt32导致64位进程上的OverflowException

时间:2018-08-02 01:59:54

标签: c# winforms bitwise-operators wndproc intptr

我想通过单击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);
}

1 个答案:

答案 0 :(得分:1)

使用已正确解包参数的现有.NET回调。在WinForms中有Control.OnMouseWheel method。可通过ModifierKeys property使用修改键。

protected override void OnMouseWheel(MouseEventArgs m)
{
    if ((ModifierKeys & Keys.Control) != 0)
    {
        ((HandledMouseEventArgs)m).Handled = true;
        // Ignore CTRL+WHEEL
        return;
    }

    base.OnMouseWheel(m);
}