Я хочу переопределить некоторые функции в элементе управления, отключив масштабирование при нажатии кнопки 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);
}
@mjwills: некоторые параметры сообщения - это IntPtr
, чтобы сделать их достаточно большими, чтобы нести указатель, но на самом деле они не являются указателями в зависимости от идентификатора сообщения. Вопрос, похоже, касается небольшого числового значения, хранящегося в одном из этих полей размером с указатель.
Используйте существующие обратные вызовы .NET, которые уже правильно разворачивают параметры. В WinForms есть Control.OnMouseWheel
метод. Клавиши-модификаторы доступны через ModifierKeys
недвижимость.
protected override void OnMouseWheel(MouseEventArgs m)
{
if ((ModifierKeys & Keys.Control) != 0)
{
((HandledMouseEventArgs)m).Handled = true;
// Ignore CTRL+WHEEL
return;
}
base.OnMouseWheel(m);
}
Спасибо за ваш ответ, к сожалению, он не работает с элементом управления ScintillaNet (доступным через Nuget), поскольку элемент управления все еще увеличивается. Кажется, что метод WndProc работает, когда я меняю константы на long и конвертирую IntPtr в Int64
@jjdem: Ах, dotPeek обнаружил, что есть HandledMouseEventArgs
, чья явная цель - отключить поведение колеса мыши по умолчанию.
что вам очень нравится @BenVoight, он отлично работает с вашим добавленным изменением
Если у вас есть 64-битный указатель (на 64-битный процесс), что вы ожидаете от
ToInt32
?