Как проверить, есть ли у пользователя браузер, открытый в C# - PullRequest
0 голосов
/ 27 апреля 2020

Я создал приложение WinForms с кнопкой. Когда пользователь нажимает эту кнопку, я хочу, чтобы мое приложение обнаруживало, открыт ли веб-браузер, такой как Chrome, IE или Firefox, и если это так, я хочу, чтобы сообщение отображалось, как в

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

А если браузер «иначе, если» не обнаружен, откройте окно с сообщением «Пожалуйста, откройте браузер».

Я новичок в C# это, вероятно, довольно простые несколько строк кода .

Если кто-нибудь может ответить на это, большое спасибо! Пожалуйста, включите #using заявления!

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы можете обратиться к следующему коду, чтобы определить, открывается ли браузер с помощью 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.

0 голосов
/ 27 апреля 2020

Поскольку вы написали, что используете WinForms, я предполагаю, что вы используете Windows. AFAIK Есть 2 способа сделать это - с помощью класса 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);
    }
}

Примечания

I'm не уверен, есть ли у всех браузеров свое имя в заголовке окна, я просто проверил те, которые у меня есть

Для добавления других браузеров вам потребуется найти имя процесса в диспетчере задач, вкладка «Сведения» - например, для Firefox запись «firefox .exe», поэтому имя процесса «firefox ». Если существуют разные имена процессов, такие как «MicrosoftEdge» и «MicrosoftEdgeCP», вам нужно немного поэкспериментировать, чтобы выяснить, какой процесс имеет главное окно.

...