2012-03-14 92 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

相關問題