1

Как часть моей служебной программы утилит Visual Studio SamTools, у меня есть процедура ввода мышей, которая ловит Ctrl + MouseWheel и отправляет команду createup/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 - просто возвращает ненулевое значение и (в теории, по крайней мере) движение мыши должно проглотите. Если это не работает так, как вы хотите, комментируйте, и мы можем выполнять итерацию.

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

+0

К сожалению, команды мыши не отображаются в настройках параметров. –

+0

OMG, так приятно снова иметь колесо мыши и кнопки назад/вперед !!!! –

+0

ха-ха, рад видеть, что это сработало! :-) –