如何关闭外部Web浏览器中的选项卡?

时间:2012-03-14 13:51:32

标签: c# wpf process oauth browser

我正在编写桌面应用程序,在一部分中我将介绍OAuth 2.0流程。

步骤如下:

  1. 启动流程 - 使用登录页面打开Web浏览器。
  2. 用户登录并授权我的应用。
  3. 在后台我搜索具有特定名称的流程,将其(名称)保存在应用程序中。
  4. 最后我关闭了网络浏览器。
  5. 问题在于,如果用户之前在网络浏览器中打开了一些标签 - 在第1点中添加了新选项卡,在第4点中。一切都已关闭(带有所有标签的网络浏览器)。

    您能否告诉我是否有办法在网络浏览器中关闭单个标签? 或者也许还有其他/更简单的方法来通过OAuth?

    作为手动解决方案,我只会向用户显示信息“现在您可以关闭此标签”,但我想自动完成。

    这是C#.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 个答案:

答案 0 :(得分:2)

正如Stephen Lee Parker所说,确实可以向某个窗口发送击键。也就是说,假设您拥有浏览器窗口的句柄。

此外,您选择的浏览器应支持关闭单独选项卡的热键,但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
    }
祝你好运!

(这也是我的第一个答案,所以我真的希望我能帮助你们中的一些人)

答案 1 :(得分:0)

还有其他方法可以使用dotnetopenauth。但是如果你真的想使用网络浏览器,我建议你使用.Net WebBrowser控件来处理任务,并处理Navigated事件以确定何时关闭它。

答案 2 :(得分:0)

可能要回答太久了,但今天我遇到了同样的问题,我将采用这种方式: 在新的浏览器进程中打开url。 Open a URL in a new browser process

然后在认证后或任何你想要的;例如就我而言;当用户将引脚输入我的WPF时;从twitter生成,我可以轻松关闭个别流程。 通过这种方式,您无需担心自打开新浏览器进程以来的其他选项卡。

答案 3 :(得分:0)

我通过将CTRL-W发送到浏览器窗口来完成此操作...