Могу ли я подавить выбранный ввод перед основным циклом приложения?

Как часть моей надстройки утилит Visual Studio SamTools, у меня есть подпрограмма ввода мыши, которая перехватывает Ctrl+MouseWheel и отправляет команду pageup/pagedown в активное текстовое окно. Visual Studio 2010 добавила новую "функцию", которая использует этот жест для увеличения / уменьшения масштаба (barf). В настоящее время моя надстройка отправляет команду прокрутки, но Visual Studio по-прежнему изменяет размер шрифта, потому что я не ем ввод.

Я установил свой крюк с вызовом SetWindowsHookEx, Вот код обратного вызова. Мой вопрос: это лучший способ запретить Visual Studio обрабатывать ввод Ctrl+MouseWheel как команду масштабирования, чтобы просто не вызывать CallNextHookEx когда я получаю событие колеса мыши с нажатой клавишей Ctrl?

(Пожалуйста, имейте в виду, что это мой старый код.):)

private IntPtr MouseCallback(int code, UIntPtr wParam, ref MOUSEHOOKSTRUCTEX lParam)
{
    try
    {
        // the callback runs twice for each action - this is the latch
        if (enterHook)
        {
            enterHook = false;
            if (code >= 0)
            {
                int x = lParam.mstruct.pt.X;
                int y = lParam.mstruct.pt.Y;

                uint action = wParam.ToUInt32();
                switch (action)
                {
                case WM_MOUSEWHEEL:
                    OnMouseWheel(new MouseEventArgs(MouseButtons.None, 0, x, y, ((short)HIWORD(lParam.mouseData)) / (int)WHEEL_DELTA));
                    break;

                default:
                    // don't do anything special
                    break;
                }
            }
        }
        else
        {
            enterHook = true;
        }
    }
    catch
    {
        // can't let an exception get through or VS will crash
    }

    return CallNextHookEx(mouseHandle, code, wParam, ref lParam);
}

А вот код, который выполняется в ответ на MouseWheel событие:

void mouse_enhancer_MouseWheel( object sender, System.Windows.Forms.MouseEventArgs e )
{
    try
    {
        if ( Keyboard.GetKeyState( System.Windows.Forms.Keys.ControlKey ).IsDown && Connect.ApplicationObject.ActiveWindow.Type == vsWindowType.vsWindowTypeDocument )
        {
            int clicks = e.Delta;
            if (e.Delta < 0)
            {
                Connect.ApplicationObject.ExecuteCommand( "Edit.ScrollPageDown", "" );
            }
            else
            {
                Connect.ApplicationObject.ExecuteCommand( "Edit.ScrollPageUp", "" );
            }
        }
    }
    catch ( System.Runtime.InteropServices.COMException )
    {
        // this occurs if ctrl+wheel is activated on a drop-down list. just ignore it.
    }
}

PS: SamTools с открытым исходным кодом (GPL) - вы можете скачать его по ссылке, а источник находится в установщике.

PSS: Ctrl + [+] и Ctrl+[-] лучше для увеличения. Давайте прокручиваем Ctrl+MouseWheel (гораздо более часто используемая команда).

1 ответ

Решение

Согласно MSDN, можно отбрасывать сообщения мыши, которые вы обрабатываете. Вот рекомендация:

Если nCode меньше нуля, подключаемая процедура должна вернуть значение, возвращаемое CallNextHookEx.

Если nCode больше или равен нулю и процедура подключения не обработала сообщение, настоятельно рекомендуется вызвать CallNextHookEx и вернуть возвращаемое значение; в противном случае другие приложения, которые установили хуки WH_MOUSE, не будут получать уведомления о хуках и в результате могут работать некорректно. Если подключаемая процедура обработала сообщение, она может вернуть ненулевое значение, чтобы система не могла передать сообщение целевой оконной процедуре.

Другими словами, если ваш обратный вызов мыши заканчивается сообщением мыши, вам не нужно вызывать следующий CallNextHookEx - просто верните ненулевое значение и (по крайней мере, в теории) движение мыши должно быть проглочено. Если это не работает так, как вы хотите, прокомментируйте, и мы можем повторить.

Кстати, еще одна возможная альтернатива: возможно, что отображение VS на колесо мыши отображается в меню Инструменты... Настройка..., как и сопоставления клавиш. В этом случае вы можете просто переназначить команды вашей надстройки вместо того, чтобы работать на уровне ловушек. Но также возможно (вероятно?), Что этот жест жестко закодирован.

Другие вопросы по тегам