Как закрыть вкладку во внешнем веб-браузере? - PullRequest
7 голосов
/ 14 марта 2012

Я пишу настольное приложение, и в одной части я иду через поток OAuth 2.0.

Шаги:

  1. Начать процесс - открыть веб-браузер со страницей входа.
  2. Пользователь входит в систему и авторизует мое приложение.
  3. В фоновом режиме я ищу процесс с определенным именем, сохраняя его (имя) в приложении.
  4. В конце я закрываю веб-браузер.

Проблема в том, что если пользователь ранее открыл несколько вкладок в веб-браузере - в пункте 1. добавлена ​​новая вкладка, а в пункте 4. все закрыто (веб-браузер со всеми вкладками).

Можете ли вы сказать мне, если есть способ закрыть одну вкладку в веб-браузере? Или, может быть, есть другой / более простой способ пройти через OAuth?

В качестве ручного решения я просто покажу пользователю информацию «Теперь вы можете закрыть эту вкладку», однако я бы хотел сделать это автоматически.

Это проект CF .Net 4.0 WPF.

string strAuthUrl = "http://accounts.example.com/login",
       strAuthCode = string.Empty;

// Request authorization from the user (by opening a browser window):
ProcessStartInfo startInfo = new ProcessStartInfo(strAuthUrl);
startInfo.CreateNoWindow = false;

//1.        
Process.Start(startInfo);   
//2. - is happening in web browser
//3.        
do
{
    foreach (Process proc in Process.GetProcesses())
    {
        if (proc.MainWindowTitle.StartsWith("Success code="))
        {
            strAuthCode = proc.MainWindowTitle.ToString().Substring(13, 30);
//4.
            try
            {

                // Close process by sending a close message to its main window.
                proc.CloseMainWindow();
                // Free resources associated with process.
                proc.Close();
                // Wait 500 milisecs for exit
                proc.WaitForExit(500);

                //if proc has not exited so far - kill it
                if (proc.HasExited == false)
                {
                    proc.Kill();
                    proc.WaitForExit();
                }
            }
            catch (Exception ex)
            {
                //Do something with exception
            }

            break;
        }
    }
}
while (string.IsNullOrEmpty(strAuthCode));

Спасибо за ваши предложения.

Ответы [ 4 ]

2 голосов
/ 31 июля 2013

Как предположил Стивен Ли Паркер, действительно возможно послать нажатие клавиши в определенное окно.То есть, учитывая, что у вас есть дескриптор окна вашего браузера.

Кроме того, ваш браузер выбора должен поддерживать горячую клавишу для закрытия отдельных вкладок, но большую часть времени работает Ctrl + W.* С помощью:

using System.Runtime.InteropServices;

и

[DllImportAttribute("user32.dll", EntryPoint = "SetForegroundWindow")]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow([InAttribute()] IntPtr hWnd);

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

byte W = 0x57; //the keycode for the W key

public static void Send(byte KeyCode, bool Ctrl, bool Alt, bool Shift, bool Win)
{
    byte Keycode = (byte)KeyCode;

    uint KEYEVENTF_KEYUP = 2;
    byte VK_CONTROL = 0x11;
    byte VK_MENU = 0x12;
    byte VK_LSHIFT = 0xA0;
    byte VK_LWIN = 0x5B;

    if (Ctrl)
        keybd_event(VK_CONTROL, 0, 0, 0);
    if (Alt)
        keybd_event(VK_MENU, 0, 0, 0);
    if (Shift)
        keybd_event(VK_LSHIFT, 0, 0, 0);
    if (Win)
        keybd_event(VK_LWIN, 0, 0, 0);

    //true keycode
    keybd_event(Keycode, 0, 0, 0); //down
    keybd_event(Keycode, 0, KEYEVENTF_KEYUP, 0); //up

    if (Ctrl)
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    if (Alt)
        keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    if (Shift)
        keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
    if (Win)
        keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

}

Вы можете фактически отправить любой код клавиатуры на клавиатуре в текущее активное окно.Поскольку вы действительно легко можете установить окно переднего плана с помощью Win32, это должно работать в большинстве приложений.

Вы также можете видеть, что этот код сначала «нажимает» на любые выбранные клавиши-модификаторы, а затем нажимает клавишу с указанным кодом.вниз, прежде чем отпустить все, что делает возможным отправку CTRL + W, например.

    void CloseTab()
    {
       SetForegroundWindow(_browserWindow.Handle);
       Send(W, true, false, false, false); //Ctrl+W
    }

Удачи!,

(Также это мой первый ответ, поэтому я действительно надеюсь, что смогучтобы помочь некоторым из вас)

0 голосов
/ 29 октября 2012

Может быть, это слишком долго, чтобы ответить, но сегодня я столкнулся с той же проблемой, и я собираюсь использовать этот способ: открыть URL-адрес в новом процессе браузера. Открыть URL в новом процессе браузера

, затем после аутентификации или чего угодно;например, в моем случае;когда пользователь ввел пин-код в мой WPF;Сгенерированный из твиттера, я могу легко закрыть отдельный процесс.Таким образом, вам не нужно беспокоиться о других вкладках, так как был открыт новый процесс браузера.

0 голосов
/ 02 ноября 2012

Я сделал это, отправив CTRL-W в окно браузера ...

0 голосов
/ 14 марта 2012

Есть и другие способы сделать это, например, использовать dotnetopenauth .Но если вы действительно хотите использовать веб-браузер, я предлагаю вам использовать для этой задачи элемент управления .Net WebBrowser и обработать событие Navigated , чтобы определить, когда его закрывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...