【问题标题】:IntPtr.ToInt32 with Bitwise operator causes OverflowException on 64-bit process使用按位运算符的 IntPtr.ToInt32 在 64 位进程上导致 OverflowException
【发布时间】: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


【解决方案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);
}

【讨论】:

  • 感谢您的回答,不幸的是,它不适用于 ScintillaNet 控件(可通过 Nuget 获得),因为该控件仍在缩放。当我将常量更改为 long 并将 IntPtr 转换为 Int64 时,WndProc 方法似乎有效
  • @jjdem:啊,dotPeek 透露有这个HandledMouseEventArgs,其明确目的是禁用鼠标滚轮的默认行为
  • 您非常喜欢@BenVoight,您添加的更改效果很好
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2016-05-31
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2015-06-11
  • 2022-01-15
  • 2014-06-20
相关资源
最近更新 更多