Example #1
0
        static DTE2 GetDTE2(WindowsAppFriend app)
        {
            WindowsAppExpander.LoadAssembly(app, typeof(ByVisualStudio).Assembly);
            var    dteType = app.Type(typeof(ByVisualStudio)).DTEType;
            AppVar obj     = app.Type().Microsoft.VisualStudio.Shell.Package.GetGlobalService(dteType);

            return(obj.Pin <DTE2>());
        }
Example #2
0
        public static void Main()
        {
            string  outputFile = @"D:\shortcuts.txt";
            Process proc;

#if VSを起動してアタッチ
            string vs2017 = @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe";
            var    proc   = Process.Start(vs2017);
            proc.WaitForInputIdle();
            while (string.IsNullOrEmpty(proc.MainWindowTitle))
            {
                Thread.Sleep(10);
                proc = Process.GetProcessById(proc.Id);
            }
#else
            // 現在デバッグ実行している VS にアタッチ
            proc = Process.GetProcessesByName("devenv").FirstOrDefault();
#endif
            WindowsAppFriend app = new WindowsAppFriend(proc);
            app.LoadAssembly(typeof(Program).Assembly);

            // https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.package.getglobalservice
            AppVar obj = app.Type().Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE._DTE));

            using (var sw = File.CreateText(outputFile))
            {
                sw.WriteLine("Guid\tID\tName\tLocalizedName\t#\tShortcut");
                Console.Clear();

                // https://docs.microsoft.com/en-us/dotnet/api/envdte80.dte2
                // https://docs.microsoft.com/en-us/dotnet/api/envdte80.dte2.commands
                EnvDTE80.DTE2   dte2     = obj.Pin <EnvDTE80.DTE2>();
                EnvDTE.Commands commands = dte2.Commands;

                int count = commands.Count;
                for (int i = 1; i <= count; i++)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.Write($"進捗 {i,7:N0} / {count,-7:N0}");

                    // https://docs.microsoft.com/en-us/dotnet/api/envdte.commands.item
                    // https://docs.microsoft.com/en-us/dotnet/api/envdte.command
                    EnvDTE.Command cmd = commands.Item(i, -1);

                    if (string.IsNullOrEmpty(cmd.Name))
                    {
                        continue;
                    }
                    if (string.IsNullOrEmpty(cmd.LocalizedName))
                    {
                        continue;
                    }

                    // https://docs.microsoft.com/en-us/dotnet/api/envdte.command.bindings
                    int b = 0;
                    foreach (string bind in cmd.Bindings)
                    {
                        sw.WriteLine($"{cmd.Guid}\t{cmd.ID}\t{cmd.Name}\t{cmd.LocalizedName}\t{++b}\t{bind}");
                    }
                }
            }
            Console.WriteLine("列挙完了");
            Process.Start(outputFile);
        }