Как получить URL из сфокусированного окна браузера Internet Explorer - PullRequest
1 голос
/ 18 июня 2019

У меня есть реализация ловушки клавиатуры, которая изменяет вывод определенного текста при заданных условиях. Чтобы определить, как форматировать вывод, мне нужно иметь возможность видеть, какое окно находится в фокусе, и если Internet Explorer находится в фокусе, мне нужно иметь возможность определить, какой URL открыт на этой конкретной вкладке.

Я работал с кодом, опубликованным Саймоном в следующем посте: Получить текущий URL из приложения форм C # windows

Process[] localByName = Process.GetProcessesByName("iexplore");


if((Keys)vkCode == Keys.LShiftKey)
{
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}


foreach (Process process in Process.GetProcessesByName("iexplore"))
{
    string url = GetInternetExplorerUrl(process);
    if (url == null)
        continue;

    Console.WriteLine("IE Url for '" + process.MainWindowTitle + "' is " + url);
}

Поскольку у меня запущен Internet Explorer (и, если на то пошло, веб-страницы открыты), я надеялся / ожидал увидеть какой-нибудь вывод с URL-адресами, показывающий открытые URL-адреса. Вместо того, чтобы записывать URL-адреса на консоль, я ничего не получаю. В случае, когда я пытался использовать GetProcessesByName, я просто получаю следующий вывод: System.Diagnostics.Process[]

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Это решение является хакерским способом выполнения работы.

Основная идея

  1. Отправка ALT + D в браузер для выбора текста URL
  2. Отправьте CTRL + C , чтобы скопировать URL

Несколько вещей, которые следует учитывать

  1. Чтобы отправить ключи наокно, оно должно быть активным окном (окно переднего плана).
  2. Если состояние окна браузера было изменено, было бы хорошо вернуть его в исходное состояние.
  3. Если буфер обменабыло бы хорошо вернуть его в исходное состояние.

Шаги для получения URL активной вкладки

  1. Найти процессы с именем "iexplor" с заголовком главного окна.
  2. Запомните исходное активное окно и исходное состояние окна браузера.
  3. Сделайте окно браузера активным окном.
  4. Запомните исходные данныев буфер обмена.
  5. Отправить ALT + D , CTRL + C
  6. Скопировать буфер обмена.
  7. Восстановите исходные данные буфера обмена.
  8. Если окно браузера было свернуто, сверните его.
  9. Восстановите исходное активное окно.

Недостатки

  1. Изменение состояния окна браузера заметно заметно.
  2. Если окно браузера не было свернуто, то при его активном окне оно будет отображено вперед.Даже если исходное активное окно будет восстановлено, оно все равно останется за ним.

Требования к коду

  1. Этот код использует пакет Vanara NuGet для Win32 API
  2. Ссылка на System.Windows.Forms необходима для Clipboard и SendKeys
  3. Для использования Clipboard атрибут Main должен иметь атрибут [STAThread]1076 *

код

using System.Windows.Forms;
using System.Diagnostics;
using Vanara.PInvoke;

…

// Get all Internet Explorer processes with a window title 
Process[] ieProcs = Process.GetProcessesByName("iexplore")
    .Where(p => !string.IsNullOrEmpty(p.MainWindowTitle))
    .ToArray();

// Initialize a URL array to hold the active tab URL
string[] ieUrls = new string[ieProcs.Length];

for (int i = 0; i < ieProcs.Length; i++)
{
    Process proc = ieProcs[i];

    // Remember the initial window style of the process window
    User32_Gdi.WindowStyles initialWndStyles = (User32_Gdi.WindowStyles)User32_Gdi.GetWindowLongPtr(proc.MainWindowHandle, User32_Gdi.WindowLongFlags.GWL_STYLE);

    // Remember the initial foreground window
    IntPtr initialFgdWnd = (IntPtr)User32_Gdi.GetForegroundWindow();

    // Show the process window.
    // If it is minimized, it needs to be restored, if not, just show
    if (initialWndStyles.HasFlag(User32_Gdi.WindowStyles.WS_MINIMIZE))
    {
        User32_Gdi.ShowWindow(proc.MainWindowHandle, ShowWindowCommand.SW_RESTORE);
    }
    else
    {
        User32_Gdi.ShowWindow(proc.MainWindowHandle, ShowWindowCommand.SW_SHOW);
    }

    // Set the process window as the foreground window
    User32_Gdi.SetForegroundWindow(proc.MainWindowHandle);

    ieUrls[i] = null;

    // Remember the initial data on the clipboard and clear the clipboard
    IDataObject dataObject = Clipboard.GetDataObject();
    Clipboard.Clear();

    // Start a Stopwatch to timeout if no URL found
    Stopwatch sw = Stopwatch.StartNew();

    // Try to copy the active tab URL
    while (string.IsNullOrEmpty(ieUrls[i]) && sw.ElapsedMilliseconds < 1000)
    {
        // Send ALT+D
        SendKeys.SendWait("%(d)");
        SendKeys.Flush();

        // Send CRTL+C
        SendKeys.SendWait("^(c)");
        SendKeys.Flush();

        ieUrls[i] = Clipboard.GetText();
    }
    // Return the initial clipboard data to the clipboard
    Clipboard.SetDataObject(dataObject);

    // If the process window was initially minimized, minimize it
    if(initialWndStyles.HasFlag(User32_Gdi.WindowStyles.WS_MINIMIZE))
    {
        User32_Gdi.ShowWindow(proc.MainWindowHandle, ShowWindowCommand.SW_MINIMIZE);
    }

    // Return the initial foreground window to the foreground
    User32_Gdi.SetForegroundWindow(initialFgdWnd);
}

// Print the active tab URL's
for (int i = 0; i < ieUrls.Length; i++)
{
    Console.WriteLine(ieUrls[i]);
}
0 голосов
/ 18 июня 2019

Чтобы получить все URL-адреса из вкладок Internet Explorer, вы можете сделать следующее:

1. Добавить ссылку на «Microsoft Internet Controls» enter image description here

2. Добавьте следующий код для получения URL:

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();

List<string> urls = shellWindows
    .Cast<SHDocVw.InternetExplorer>()
    .Where(ie => System.IO.Path.GetFileNameWithoutExtension(ie.FullName).ToLower() == "iexplore")
    .Select(ie => ie.LocationURL)
    .ToList();

foreach (string url in urls)
{
    Console.WriteLine(url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...