2012-03-14 10 views
7

私はデスクトップアプリケーションを作成していますが、一部でOAuth 2.0のフローを参照しています。外部Webブラウザのタブを閉じるには?

手順は次のとおりです。

  1. スタートプロセス - ログインページとWebブラウザを開きます。
  2. ユーザーがログインし、自分のアプリケーションを認証します。
  3. バックグラウンドでは、特定の名前のプロセスを検索し、アプリケーションに名前(名前)を保存します。
  4. 最後に私はウェブブラウザを閉じます。

ユーザーが以前にWebブラウザでいくつかのタブを開いていた場合、ポイント1で新しいタブが追加され、ポイント4にすべてのタブが追加されました。

ウェブブラウザで1つのタブを閉じる方法があるかどうか教えてください。 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の認証を実装するための最もエキゾチックな方法については、私は今まで見たことがありません –

+0

トピックに関する詳細:このブラウザの代わりに、既存のC#OAuthライブラリの1つ、たとえばhttp://stackoverflow.com/questions/3997172/oauth-2-0 -service-provider-net-libraries –

+3

ネイティブの「WebBrowser」コントロールを使用するだけで、アプリケーション内にそのサービスを保持することができます。 –

答えて

0

dotnetopenauthのように、これを行うには他にも方法があります。しかし、実際にWebブラウザを使用する場合は、コントロールの.Net WebBrowserを使用し、Navigatedイベントを処理して、いつ閉じるかを決定することをお勧めします。

0

答えが長すぎるかもしれませんが、今日私は同じ問題に直面しました。この方法を使用します: 新しいブラウザプロセスでURLを開きます。 Open a URL in a new browser process

認証後、または必要な場合は、例えば私の場合;ユーザーがWPFにピンを入力したとき。私は簡単に個々のプロセスを閉じることができます。 このようにして、新しいブラウザプロセスが開かれたので、他のタブについて心配する必要はありません。スティーブン・リー・パーカーが示唆したように、私は、ブラウザのウィンドウにCTRL-Wは、送信することでこれをやった

0

...

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コードの多くを掘り出すことから私を救った:) –

+0

あなたはようこそ!この回答を投稿して以来、Keybd_Eventの代わりにSendInputメソッドを使用する方が実際には優れていることが分かりました。一部のフルスクリーンゲームのように、SendInputでのみ機能します。 – iKevenaar

関連する問題