好的,这是一个 100 万美元的小问题。我正在开发一个应用程序来检查您的任何浏览器当前是否正在运行 Flash 应用程序。这是我的核心本机实现:
// Using CreateToolhelp32Snapshot allows to list all the modules loaded by a specific process.
internal static Boolean ProcessContainsModule(Process process, String moduleMask)
{
    IntPtr snapshotHandle;
    if (Environment.Is64BitProcess)
        snapshotHandle = CreateToolhelp32Snapshot((SnapshotFlags.Module | SnapshotFlags.Module32), (UInt32)process.Id);
    else
        snapshotHandle = CreateToolhelp32Snapshot(SnapshotFlags.Module, (UInt32)process.Id);
    if (snapshotHandle == IntPtr.Zero)
        return false;
    Boolean result = false;
    ModuleEntry entry = new ModuleEntry();
    entry.Size = ModuleEntry.SizeOf;
    if (Module32First(snapshotHandle, ref entry))
    {
        do
        {
            if (entry.ModuleName.FitsMask(moduleMask))
            {
                result = true;
                break;
            }
            entry = new ModuleEntry();
            entry.Size = ModuleEntry.SizeOf;
        }
        while (Module32Next(snapshotHandle, ref entry));
    }
    CloseHandle(snapshotHandle);
    return result;
}
// This is a simple wildcard matching implementation.
public static Boolean FitsMask(this String value, String mask)
{
    Regex regex;
    if (!s_MaskRegexes.TryGetValue(mask, out regex))
        s_MaskRegexes[mask] = regex = new Regex(String.Concat('^', Regex.Escape(mask.Replace(".", "__DOT__").Replace("*", "__STAR__").Replace("?", "__QM__")).Replace("__DOT__", "[.]").Replace("__STAR__", ".*").Replace("__QM__", "."), '$'), RegexOptions.IgnoreCase);
    return regex.IsMatch(value);
}
现在,Process Explorer在我的流程探索中非常有用。
用 Chrome 检测这个非常简单:
if ((process.ProcessName == "chrome") && NativeMethods.ProcessContainsModule(process, "PepFlashPlayer.dll"))
用 Firefox 检测这个也很简单:
if ((process.ProcessName.StartsWith("FlashPlayerPlugin")) && NativeMethods.ProcessContainsModule(process, "NPSWF32*"))
与往常一样,当您查看 Internet Explorer 时,一切都会发生变化。有关如何使用 Microsoft 的浏览器检测到这一点的任何线索?