1

내 Visual Studio 유틸리티 추가 기능 SamTools의 일부로 Ctrl + MouseWheel을 캐치하고 활성 텍스트 창에 pageup/pagedown 명령을 보내는 마우스 입력 루틴이 있습니다. Visual Studio 2010에는 확대/축소 (바코드)를위한 제스처를 사용하는 새로운 "기능"이 추가되었습니다. 현재 내 추가 기능에서 스크롤 명령을 보내지 만 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 후크가 설치된 다른 응용 프로그램 은 후크 알림 을받지 않으며 결과로 잘못 작동 할 수 있습니다. 후크 프로 시저 메시지를 처리 ​​한 경우 0이 아닌 값을 반환하여 시스템 이 메시지를 대상 창 프로 시저로 전달하지 못하게 할 수 있습니다. 마우스 이동해야한다 (적어도 이론적으로) 단지 반환이 아닌 값과 - 마우스 콜백 마우스 메시지를 사용하여 끝나는 경우 즉

, 당신은 다음 CallNextHookEx를 호출 할 필요가 없습니다 삼켰다. 원하는 방식으로 작동하지 않는다면 의견을 보내고 반복 할 수 있습니다.

다른 대안 : 마우스 휠에 대한 VS의 매핑이 키 매핑과 마찬가지로 도구 ... 사용자 지정 ... UI에 나타날 수 있습니다. 이 경우 단순히 훅 수준에서 작업하는 대신 추가 기능의 명령을 다시 매핑 할 수 있습니다. 그러나이 제스처는 하드 코딩 된 것으로 추정됩니다 (가능성이 있습니까?).

+0

불행히도 마우스 명령은 사용자 지정 옵션에 표시되지 않습니다. –

+0

OMG, 내 마우스 휠과 뒤로/앞으로 버튼을 가지고있는 것이 좋다 !!!! –

+0

하하, 이것이 효과가 있음을 알게되어 기쁩니다! :-) –

관련 문제