【问题标题】:How to check If A User Has a browser open in C#如何检查用户是否在 C# 中打开了浏览器
【发布时间】:2020-08-10 14:06:03
【问题描述】:

我创建了一个带有按钮的 WinForms 应用程序。当用户按下该按钮时,我希望我的应用程序检测 Web 浏览器是否打开,例如 Chrome、IE 或 Firefox,如果是,我希望显示一条消息,例如

Message.Show("Browser Was Detected As Open", 
             "Success",
             MessageBoxButtons.OK, 
             MessageBoxIcon.None); 

如果没有检测到“else if”浏览器,请打开一个错误框,上面写着“请打开浏览器”。

我是 C# 新手,这可能是非常简单的几行代码。

如果有人能回答这个问题,非常感谢!请包括#using 语句!

【问题讨论】:

  • 为什么 C# 中的 Windows 窗体应用程序显然? WPF、UWP、Xamarin、UNO,...有一些 UI 框架处理 C#。但实际上,你使用什么样的 UI 框架并不重要。这只是平台问题(Windows、macOS、Linux、iOS、Android...)
  • 我看不出任何原因,为什么知道用户是否打开了任何浏览器会有所帮助。如果我想从我的应用程序打开一个 url,我将该 url 传递给系统,它将使用用户选择的默认浏览器打开该 url。

标签: c# visual-studio web-applications detect web-application-project


【解决方案1】:

我尝试使用上面的答案,但由于本地化和搜索引擎可能定制的原因,我对检查所有正在运行的进程或检查标题都不满意。 这是我快速有效的解决方案,它检查浏览器是否存在并检查它们是否至少有 1 个活动窗口。

internal static bool CheckIfAnyBrowserIsRunning()
        {
            bool answer = false;
            foreach(var browser in GetBrowsers())
            {
                Process[] Processes = Process.GetProcessesByName(browser);
                if (Processes.Length <= 0)
                    continue;
                if (!Processes.Any(d=>d.MainWindowHandle != IntPtr.Zero))
                    continue;
                answer = true;
                break;
            }
            return answer;
        }

internal static List<string> GetBrowsers()
        {
            return new List<string>() { "chrome", "msedge", "firefox" }; //add other browser process names
        } 

【讨论】:

    【解决方案2】:

    您可以参考下面的代码来检测是否使用windows API打开了浏览器。

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                var RunningProcessPaths = ProcessFileNameFinderClass.GetAllRunningProcessFilePaths();
    
                if (RunningProcessPaths.Contains("firefox.exe"))
                {
                    MessageBox.Show("Firefox Browser Was Detected As Open",
                  "Success",
                  MessageBoxButtons.OK,
                  MessageBoxIcon.None);
                }
    
                if (RunningProcessPaths.Contains("chrome.exe"))
                {
                    MessageBox.Show("Google chrome Browser Was Detected As Open",
                    "Success",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.None);
                }
                if (RunningProcessPaths.Contains("iexplore.exe"))
                {
                    MessageBox.Show("IE Browser Was Detected As Open",
                  "Success",
                  MessageBoxButtons.OK,
                  MessageBoxIcon.None);
                }
                //MicrosoftEdge.exe
                if (RunningProcessPaths.Contains("MicrosoftEdge.exe"))
                {
                    MessageBox.Show("Microsoft Edge Browser Was Detected As Open",
                  "Success",
                  MessageBoxButtons.OK,
                  MessageBoxIcon.None);
                }
    
            }
        }
    
    
    
      public class ProcessFileNameFinderClass
        {
            public static HashSet<string> GetAllRunningProcessFilePaths()
            {
                var allProcesses = System.Diagnostics.Process.GetProcesses();
                HashSet<string> ProcessExeNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
                foreach (Process p in allProcesses)
                {
                    string processExePath = GetProcessExecutablePath(p);
                    ProcessExeNames.Add(System.IO.Path.GetFileName(processExePath));
                }
                return ProcessExeNames;
            }
    
    
            /// <summary>
            /// Get executable path of running process
            /// </summary>
            /// <param name="Process"></param>
            /// <returns></returns>
            public static string GetProcessExecutablePath(Process Process)
            {
                try
                {
                    if (Environment.OSVersion.Version.Major >= 6)
                    {
                        return GetExecutablePathAboveXP(Process.Id);// this gets the process file name without running as administrator 
                    }
                    return Process.MainModule.FileName;// Vista and later this requires running as administrator.
                }
                catch
                {
                    return "";
                }
            }
    
            public static string GetExecutablePathAboveXP(int ProcessId)
            {
                int MAX_PATH = 260;
                StringBuilder sb = new StringBuilder(MAX_PATH + 1);
                IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessId);
                if (hprocess != IntPtr.Zero)
                {
                    try
                    {
                        int size = sb.Capacity;
                        if (QueryFullProcessImageName(hprocess, 0, sb, ref size))
                        {
                            return sb.ToString();
                        }
                    }
                    finally
                    {
                        CloseHandle(hprocess);
                    }
                }
                return "";
            }
    
            [Flags()]
            private enum ProcessAccessFlags : uint
            {
                PROCESS_ALL_ACCESS = 0x1f0fff,
                PROCESS_TERMINATE = 0x1,
                PROCESS_CREATE_THREAD = 0x2,
                PROCESS_VM_OPERATION = 0x8,
                PROCESS_VM_READ = 0x10,
                PROCESS_VM_WRITE = 0x20,
                PROCESS_DUP_HANDLE = 0x40,
                PROCESS_SET_INFORMATION = 0x200,
                PROCESS_SET_QUOTA = 0x100,
                PROCESS_QUERY_INFORMATION = 0x400,
                PROCESS_QUERY_LIMITED_INFORMATION = 0x1000,
                SYNCHRONIZE = 0x100000,
                PROCESS_CREATE_PROCESS = 0x80,
                PROCESS_SUSPEND_RESUME = 0x800
            }
    
            [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            private static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, [Out(), MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpExeName, ref int lpdwSize);
    
            [DllImport("kernel32.dll")]
            private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool CloseHandle(IntPtr hHandle);
        }
    

    您可以在 google chrome、IE、MicorsoftEdge 和 Firefox 上试用。

    【讨论】:

      【解决方案3】:

      由于您使用的是 WinForms,因此我假设您使用的是 Windows。 AFAIK 有两种方法可以做到这一点 - 使用 Process 类或使用 WinAPI。

      我不会介绍 WinAPI 变体,因为它更长更复杂,而且我也不会真正使用它(大多数任务都可以使用纯 C# 完成)。

      您可以在 button.Click 事件处理程序中调用此方法:

      private void DetectOpenBrowser()
      {
          var detector = new BrowserDetector();
          if (detector.BrowserIsOpen())
          {
              MessageBox.Show(this, "Browser Was Detected As Open", "Success", MessageBoxButtons.OK);
          }
          else
          {
              MessageBox.Show(this, "Please Open Browser", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
      }
      

      BrowserDetector 类:

      using System.Collections.Generic;
      using System.Diagnostics;
      using System.Linq;
      
      internal class BrowserDetector
      {
          private readonly Dictionary<string, string> browsers = new Dictionary<string, string>
                                                        {
                                                            {
                                                                "firefox", "Mozilla Firefox"
                                                            },
                                                            {
                                                                "chrome", "Google Chrome"
                                                            },
                                                            {
                                                                "iexplore", "Internet Explorer"
                                                            },
                                                            {
                                                                "MicrosoftEdgeCP", "Microsoft Edge"
                                                            }
                                                            // add other browsers
                                                        };
      
          public bool BrowserIsOpen()
          {
              return Process.GetProcesses().Any(this.IsBrowserWithWindow);
          }
      
          private bool IsBrowserWithWindow(Process process)
          {
              return this.browsers.TryGetValue(process.ProcessName, out var browserTitle) && process.MainWindowTitle.Contains(browserTitle);
          }
      }
      

      注意事项

      我不确定是否所有浏览器的窗口标题中都有它们的名称,我只是检查了那些可用的浏览器。

      要添加其他浏览器,您需要在任务管理器的详细信息选项卡中找到进程名称 - 例如。对于 Firefox,该条目是“firefox.exe”,因此进程名称是“firefox”。如果有不同的进程名称,例如“MicrosoftEdge”和“MicrosoftEdgeCP”,您将需要尝试一下以确定哪个进程具有主窗口。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2016-03-31
        • 2021-03-01
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 1970-01-01
        相关资源
        最近更新 更多