65.9K
CodeProject 正在变化。 阅读更多。
Home

Visual Studio 2008 (C++) 中使用鼠标侧键进行前后导航

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.96/5 (13投票s)

2008年4月18日

GPL3

1分钟阅读

viewsIcon

53118

downloadIcon

383

为 Visual Studio 2008 (C++) 实现使用鼠标侧键进行前后导航。

引言

对于大多数程序,用户可以使用鼠标的“侧键”进行前后导航。此插件将在 Visual Studio 2008 C++ 中实现此功能。(C# 已经内置此功能)。

Example usage

  1. 跳转到函数定义(在函数名上右键单击,选择“转到定义”)。
  2. 使用鼠标的“后退按钮”返回。

代码内部一览

Visual Studio 插件的 API 没有提供获取鼠标按钮是否在 Visual Studio 窗口内被按下的通知机制。因此,需要使用 Hook 来实现此功能。

private void InitHook()
{
  this.MouseProcDelegate = new HookProc(this.MouseProc);
  uint id = GetCurrentThreadId();
  hhook=SetWindowsHookEx(WH_MOUSE, 
        this.MouseProcDelegate, IntPtr.Zero, id);
}

当 Visual Studio 加载插件时(在 VS 启动时),会调用 InitHook() 函数。Hook 只附加到由 GetCurrentThreadId() 返回的线程 ID 对应的线程。Hook 会在 Visual Studio 之前接收鼠标事件。另一种可能性是 ShellHook (WH_SHELL) (使用 APPCOMMAND_BROWSER_BACKWARDAPPCOMMAND_BROWSER_FORWARD 事件的 HSHELL_APPCOMMAND)。但是,这种方法效果不佳(事件并非在所有情况下都会触发)。

Hook 将调用 MouseProc 函数

 private int MouseProc(int code, IntPtr wParam, ref MOUSEHOOKSTRUCTEX lParam)
    {
      try
      {
        if (code != HC_ACTION)
        {
          return CallNextHookEx(hhook, code, wParam, ref lParam);
        }

        if (wParam.ToInt32() == WM_XBUTTONUP)
        {
          switch (HiWord(lParam.mouseData))
          {
            case XBUTTON1:
              Debug.Write("mouse back button\n");
              _applicationObject.ExecuteCommand("View.NavigateBackward", "");
            return 1;

            case XBUTTON2:
              Debug.Write("mouse forward button\n");
              _applicationObject.ExecuteCommand("View.NavigateForward", "");
            return 1;
           }

        }

      }
      catch
      {

      }

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

MOUSEHOOKSTRUCTEXMOUSEHOOKSTRUCT 的更新版本,支持额外的鼠标按钮。如果 wParamWM_XBUTTONUP,则释放了其中一个鼠标侧键。可以使用 lParam.mouseData 的高字来确定释放了哪个侧键。

  • XBUTTON1:后退按钮
  • XBUTTON2:前进按钮

最后,使用 ExecuteCommand() 调用 Visual Studio 的导航功能

_applicationObject.ExecuteCommand("View.NavigateBackward", "");
_applicationObject.ExecuteCommand("View.NavigateForward", "");

历史

  • 0.2:检查鼠标按钮是否在 C++ 编辑器窗口内被按下。
  • 0.1:初始版本。
© . All rights reserved.