2012-03-14 93 views
7

我正在编写桌面应用程序,并且在一部分中我将介绍OAuth 2.0流程。如何在外部网页浏览器中关闭标签页?

的步骤是:

  1. 启动过程 - 打开网页浏览器登录页面。
  2. 用户登录并授权我的应用程序。
  3. 在后台我搜索具有特定名称的进程,将其保存(名称)在应用程序中。
  4. 最后,我关闭了Web浏览器。

问题是,如果用户以前在网络浏览器中打开过一些标签 - 在第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)); 

感谢您的建议。

+1

+1实现验证我的最奇特的方式有史以来 – 2012-03-14 13:54:25

+0

更多关于主题:你可能会考虑使用现有的C#OAuth库之一,而不是这个浏览器的东西 - 例如,从http://stackoverflow.com/questions/3997172/oauth-2-0的答案之一-service-provider-net-libraries – 2012-03-14 13:56:55

+3

您可以通过使用本地'WebBrowser'控件将它保留在您的应用程序中。 – 2012-03-14 13:56:56

回答

0

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

0

可能是它太长的回答,但今天我面临同样的问题,我会用这种方式: 在新的浏览器进程中打开网址。 Open a URL in a new browser process

然后验证后或任何你想要的;例如在我的情况下;当用户将密码输入到我的WPF中时;从twitter生成,我可以轻松关闭个人进程。 通过这种方式,您无需担心自从打开新的浏览器进程以来的其他选项卡。

0

我已经通过发送CTRL-W在浏览器窗口中做到了这一点......

2

斯蒂芬李帕克暗示,它确实是可以发送击键到某个窗口。也就是说,假设你有浏览器窗口的句柄。

而且,您的choise的浏览器应该支持热键关闭独立的标签,但按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

干杯!旧帖子,但你救了我挖掘了很多旧的W32代码:) – 2014-03-03 09:14:58

+0

不客气!自发布这个答案以来,我了解到使用SendInput方法而不是Keybd_Event实际上更好。在某些情况下,像某些全屏游戏,它只能与SendInput一起使用。 – iKevenaar 2014-03-31 22:05:40

相关问题