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






2.96/5 (13投票s)
为 Visual Studio 2008 (C++) 实现使用鼠标侧键进行前后导航。
引言
对于大多数程序,用户可以使用鼠标的“侧键”进行前后导航。此插件将在 Visual Studio 2008 C++ 中实现此功能。(C# 已经内置此功能)。
Example usage
- 跳转到函数定义(在函数名上右键单击,选择“转到定义”)。
- 使用鼠标的“后退按钮”返回。
代码内部一览
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_BACKWARD
和 APPCOMMAND_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);
}
MOUSEHOOKSTRUCTEX
是 MOUSEHOOKSTRUCT
的更新版本,支持额外的鼠标按钮。如果 wParam
是 WM_XBUTTONUP
,则释放了其中一个鼠标侧键。可以使用 lParam.mouseData
的高字来确定释放了哪个侧键。
XBUTTON1
:后退按钮XBUTTON2
:前进按钮
最后,使用 ExecuteCommand()
调用 Visual Studio 的导航功能
_applicationObject.ExecuteCommand("View.NavigateBackward", "");
_applicationObject.ExecuteCommand("View.NavigateForward", "");
历史
- 0.2:检查鼠标按钮是否在 C++ 编辑器窗口内被按下。
- 0.1:初始版本。