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 scroll(非常に一般的に使用されるコマンド)。

答えて

1

MSDNによれば、処理するマウスメッセージを投げることができます。ここで推奨です:

nCode社がゼロより小さい場合、フック 手順はCallNextHookExによって返された値 を返す必要があります。 nCode社は ゼロ以上で、フックプロシージャが プロセスメッセージしなかった場合は

は、それは非常に あなたは CallNextHookExを呼び出すと、値それ リターンを返すことをお勧めします。そうでなければ、WH_MOUSEフックをインストールした他のアプリケーション はフック通知 を受信せず、 という結果として誤って動作する可能性があります。フックプロシージャ がメッセージを処理した場合、システム がメッセージをターゲット ウィンドウプロシージャに渡さないように、 の値が0以外の値を返します。

つまり

マウスのコールバックは、マウスメッセージを使って終了した場合、あなたは次のCallNextHookExを呼び出す必要はありません - ちょうど(少なくとも、理論的には)ゼロでない値を返すと、マウスの移動すべきです飲み込む。それがあなたが望むように動作しない場合は、コメントし、私たちは反復することができます。

もう1つの可能な選択肢:マウスホイールへのVSのマッピングが、ツール...カスタマイズ... UIに表示される可能性があります。これは、キーマッピングと同様です。その場合、フックレベルで作業するのではなく、単にアドインのコマンドを再マップすることができます。しかし、このジェスチャがハードコーディングされている可能性もあります(おそらく?)。

+0

残念ながら、マウスコマンドはカスタマイズオプションに表示されません。 –

+0

OMG、私のマウスホイールとバック/フォワードボタンをもう一度持っていいですね!!!! –

+0

ハッハッハー、これがうまくいったのを見てうれしい! :-) –

関連する問題