Last active
March 15, 2023 12:50
-
-
Save Benshi/991161becbbaa1ffaa4576334c3de40a to your computer and use it in GitHub Desktop.
[C#] .NET 6 で、GetActiveObject を使って VS/Access/Word/Excel/PowerPoint で開いているドキュメントのパスを得る
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// this code for .NET 6 | |
using System; | |
using System.Runtime.InteropServices; | |
using System.Runtime.InteropServices.ComTypes; | |
if (OperatingSystem.IsWindows()) | |
{ | |
// VS2022=17.0, VS2019=16.0, VS2017=15.0, VS2015=14.0, VS2013=12.0, VS2012=11.0, VS2010=10.0, VS2008=9.0, VS2005=8.0, VS2003=7.1, VS2002=7 | |
foreach (var v in new []{ "", ".17.0", ".16.0", ".15.0", ".14.0", ".12.0", "11.0", ".10.0", ".9.0"}) | |
{ | |
dynamic? dte = Example.GetObject($"VisualStudio.DTE{v}"); | |
if (dte is not null) | |
{ | |
try | |
{ | |
var solution = dte.Solution; | |
Console.WriteLine($"Visual Studio{v}: {solution?.FullName}"); | |
Marshal.FinalReleaseComObject(solution); | |
} | |
catch (Exception) { } | |
Marshal.FinalReleaseComObject(dte); | |
} | |
} | |
dynamic? accessApp = Example.GetObject("Access.Application"); | |
if (accessApp is not null) | |
{ | |
var database = accessApp.CurrentDb(); // プロパティではなくメソッド | |
var accessHwnd = accessApp.hWndAccessApp(); // プロパティではなくメソッド | |
Console.WriteLine($"Access: {database.Name}, hWnd=0x{accessHwnd:X}"); | |
var screen = accessApp.Screen; | |
var form = default(dynamic); | |
try | |
{ | |
if ((form = screen?.ActiveForm) is not null) | |
{ | |
Console.WriteLine($"\thWnd=0x{form.Hwnd:X}, Caption={form.Caption}"); | |
Marshal.ReleaseComObject(form); | |
} | |
} | |
catch (Exception) { } | |
finally | |
{ | |
if (form is not null) | |
{ | |
Marshal.FinalReleaseComObject(form); | |
} | |
} | |
Marshal.FinalReleaseComObject(screen); | |
Marshal.FinalReleaseComObject(database); | |
Marshal.FinalReleaseComObject(accessApp); | |
} | |
dynamic? wordApp = Example.GetObject("Word.Application"); | |
if (wordApp is not null) | |
{ | |
var document = wordApp.ActiveDocument; | |
Console.WriteLine($"Word: Saved = {document.Saved}, {document.FullName}"); | |
if (wordApp.ActiveWindow is { } window) | |
{ | |
Console.WriteLine($"\tHwnd=0x{window.Hwnd:X}, Caption={window.Caption}"); | |
Marshal.ReleaseComObject(window); | |
} | |
Marshal.FinalReleaseComObject(document); | |
Marshal.FinalReleaseComObject(wordApp); | |
} | |
dynamic? excelApp = Example.GetObject("Excel.Application"); | |
if (excelApp is not null) | |
{ | |
var book = excelApp.ActiveWorkbook; | |
Console.WriteLine($"Excel: Instance={excelApp.HinstancePtr}, Saved = {book.Saved}, {book.FullName}"); | |
if (excelApp.ActiveWindow is { } window) | |
{ | |
Console.WriteLine($"\tHwnd=0x{window.Hwnd:X}, Caption={window.Caption}"); | |
Marshal.ReleaseComObject(window); | |
} | |
Marshal.FinalReleaseComObject(book); | |
Marshal.FinalReleaseComObject(excelApp); | |
} | |
dynamic? pptApp = Example.GetObject("PowerPoint.Application"); | |
if (pptApp is not null) | |
{ | |
var presentation = pptApp.ActivePresentation; | |
Console.WriteLine($"PowerPoint: Saved = {presentation.Saved}, {presentation.FullName}"); | |
if (pptApp.ActiveWindow is { } window) | |
{ | |
// Console.WriteLine($"\tHWND=0x{window.HWND:X}, Caption={window.Caption}"); | |
Console.WriteLine($"\tCaption={window.Caption}"); | |
Marshal.ReleaseComObject(window); | |
} | |
Marshal.FinalReleaseComObject(presentation); | |
Marshal.FinalReleaseComObject(pptApp); | |
} | |
} | |
static class Example | |
{ | |
public static object? GetObject(string progID) | |
{ | |
try | |
{ | |
CLSIDFromProgID(progID, out Guid clsid); | |
return GetActiveObject(ref clsid, IntPtr.Zero); | |
} | |
catch | |
{ | |
return null; | |
} | |
} | |
[DllImport("ole32.dll", PreserveSig = false)] | |
static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] string progId, out Guid clsid); | |
[DllImport("oleaut32.dll", PreserveSig = false)] | |
[return: MarshalAs(UnmanagedType.Interface)] | |
static extern object GetActiveObject(ref Guid rclsid, IntPtr reserved); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment