gpt4 book ai didi

c# - 将鼠标侧键绑定(bind)到 VisualStudio 操作

转载 作者:太空狗 更新时间:2023-10-30 00:49:21 24 4
gpt4 key购买 nike

我尝试将 XButton 1 和 2(鼠标的侧键)重定向到特定的 Visual Studio 操作。

当我按下 XButton1 时,我想编译/构建项目。此操作默认绑定(bind)到 F6

当我按下 XButton2 时,我想在代码和设计 View (WinForms) 之间切换。这绑定(bind)到 F7

在多次尝试使用 Visual Studio 内置工具后,我使用 AutoHotKey 创建了以下脚本:

XButton2:: 
IfWinActive Microsoft Visual Studio
{
Send {F7}

return
}


XButton1::
IfWinActive Microsoft Visual Studio
{
Send {F6}

return
}

但是我想知道是否有人知道使用 Visual Studio 2015 实现相同目标的 native 方法?

最佳答案

解决方案

主要思想是注册全局鼠标钩子(Hook)并处理所需的鼠标事件并运行 visual studio 命令。为此:

  1. 首先创建一个 Visual Studio Package项目。
  1. 使用 SetWindowsHookEx 注册一个全局鼠标钩子(Hook)通过传递 WH_MOUSE_LL 并处理所需的鼠标事件,例如 WM_XBUTTONDOWN .在加载解决方案时执行注册。
  1. 使用 DTE.ExecuteCommand 运行所需的 Visual Studio 命令传递合适的命令,例如 Build.BuildSolution:

    var dte = (EnvDTE.DTE)this.GetService(typeof(EnvDTE.DTE));
    dte.ExecuteCommand("Build.BuildSolution");
  1. 不要忘记使用 UnhookWindowsHookEx 取消 Hook 当解决方案关闭时。

注意:

  • 要找到您需要的命令,请转到 工具 → 选项 → 环境 → 键盘 并找到您需要的命令。

  • 您会找到很多关于如何注册全局鼠标 Hook 的资源,例如 this我改变了一下并用于测试。在帖子的末尾,您可以找到完整的源代码。

  • 在 Visual Studio 2013 中,加载项已弃用,因此您可以使用 Visual Studio Add-in 执行相同的操作项目,但最好使用 VSPackages 来完成。

实现

首先创建一个 Visual Studio 包项目并将包的代码更改为我在此处发布的代码。还将我用于全局鼠标 Hook 和 Windows API 的类添加到解决方案中。

打包

这是我的包的完整代码:

using Microsoft.VisualStudio.Shell;
using System;
using System.Runtime.InteropServices;

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidVSPackage1PkgString)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]
public sealed class VSPackage1Package : Package
{
public VSPackage1Package() { }
EnvDTE.DTE dte;
protected override void Initialize()
{
base.Initialize();
dte = (EnvDTE.DTE)this.GetService(typeof(EnvDTE.DTE));
dte.Events.SolutionEvents.Opened += SolutionEvents_Opened;
dte.Events.SolutionEvents.AfterClosing += SolutionEvents_AfterClosing;
}
void SolutionEvents_AfterClosing() { MouseHook.Stop(); }
void SolutionEvents_Opened()
{
MouseHook.Start();
MouseHook.MouseAction += MouseHook_MouseAction;
}
void MouseHook_MouseAction(object sender, EventArgs e)
{
dte.ExecuteCommand("Build.BuildSolution");
}
}

Windows API 消息、结构和方法

using System;
using System.Runtime.InteropServices;
public class Win32
{
public delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
public const int WH_MOUSE_LL = 14;
public enum MouseMessages
{
WM_LBUTTONDOWN = 0x0201, WM_LBUTTONUP = 0x0202,
WM_MOUSEMOVE = 0x0200, WM_MOUSEWHEEL = 0x020A,
WM_RBUTTONDOWN = 0x0204, WM_RBUTTONUP = 0x0205
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT { public int x; public int y; }
[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
public POINT pt;
public uint mouseData;
public uint flags;
public uint time;
public IntPtr dwExtraInfo;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn,
IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam,
IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
}

全局鼠标钩子(Hook)

因为我的鼠标中没有 XButton,所以我处理了 WM_RBUTTONDOWN 事件。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public static class MouseHook
{
public static event EventHandler MouseAction = delegate { };
private static Win32.LowLevelMouseProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Start() { _hookID = SetHook(_proc); }
public static void Stop() { Win32.UnhookWindowsHookEx(_hookID); }
private static IntPtr SetHook(Win32.LowLevelMouseProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
var handle = Win32.GetModuleHandle(curModule.ModuleName);
return Win32.SetWindowsHookEx(Win32.WH_MOUSE_LL, proc, handle, 0);
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 &&
Win32.MouseMessages.WM_RBUTTONDOWN == (Win32.MouseMessages)wParam)
{
Win32.MSLLHOOKSTRUCT hookStruct =
(Win32.MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam,
typeof(Win32.MSLLHOOKSTRUCT));
MouseAction(null, new EventArgs());
}
return Win32.CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}

关于c# - 将鼠标侧键绑定(bind)到 VisualStudio 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com