以下改編自:http://pinvoke.net/default.aspx/user32.EnumDesktopWindows
你會想改變EnumWindowsProc過濾條件,以滿足您的需求。代碼查看窗口標題,但如果需要文件路徑,則可以使用hWnd來查找。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
namespace ConsoleApplication5
{
class Program
{
const int MAXTITLE = 255;
private static ArrayList mTitlesList;
private delegate bool EnumDelegate(IntPtr hWnd, int lParam);
[DllImport("user32.dll", EntryPoint="EnumDesktopWindows", ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
private static extern bool _EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);
[DllImport("user32.dll", EntryPoint="GetWindowText", ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
private static extern int _GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
[DllImport("user32.dll", EntryPoint = "GetWindowModuleFileName", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
private static extern int _GetWindowModuleFileName(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
private static bool EnumWindowsProc(IntPtr hWnd, int lParam)
{
string title = GetWindowText(hWnd);
if (title.Contains("Microsoft Word") ||
title.Contains("Microsoft Access") ||
title.Contains("Microsoft Excel") ||
title.Contains("Microsoft Outlook") ||
title.Contains("Microsoft PowerPoint"))
{
mTitlesList.Add(title);
}
return true;
}
public static string GetWindowText(IntPtr hWnd)
{
StringBuilder title = new StringBuilder(MAXTITLE);
int titleLength = _GetWindowText(hWnd, title, title.Capacity + 1);
title.Length = titleLength;
return title.ToString();
}
public static string[] GetDesktopWindowsCaptions()
{
mTitlesList = new ArrayList();
EnumDelegate enumfunc = new EnumDelegate(EnumWindowsProc);
IntPtr hDesktop = IntPtr.Zero; // current desktop
bool success = _EnumDesktopWindows(hDesktop, enumfunc, IntPtr.Zero);
if (success)
{
string[] titles = new string[mTitlesList.Count];
mTitlesList.CopyTo(titles);
return titles;
}
else
{
int errorCode = Marshal.GetLastWin32Error();
string errorMessage = String.Format("EnumDesktopWindows failed with code {0}.", errorCode);
throw new Exception(errorMessage);
}
}
static void Main()
{
string[] desktopWindowsCaptions = GetDesktopWindowsCaptions();
foreach (string caption in desktopWindowsCaptions)
{
Console.WriteLine(caption);
}
}
}
}
因此,從插件的上下文中,您可以知道某個文件是否已打開但無法識別它?嗯...有趣。 – 2010-02-06 06:37:08
您如何認爲這包含足夠遠程的信息來回答您的問題? – 2010-02-06 06:37:47
我懷疑你的問題是可以回答的。 Office,C#,共享加載項(這是什麼?),你混合了許多沒有適當上下文的術語,並且一步一步解釋你正在做什麼以及你正在使用哪些技術,除了MS Office和.NET – mloskot 2010-02-06 06:40:29