2012-03-14 14 views
7

मैं एक डेस्कटॉप एप्लिकेशन लिख रहा हूं और एक भाग में मैं ओएथ 2.0 प्रवाह से गुजरता हूं।बाहरी वेब ब्राउज़र में टैब कैसे बंद करें?

कदम हैं:

  1. प्रारंभ प्रक्रिया - प्रवेश पृष्ठ के साथ खुला वेब ब्राउज़र।
  2. उपयोगकर्ता लॉग इन और मेरे ऐप को अधिकृत करें।
  3. पृष्ठभूमि में मैं एक विशिष्ट नाम के साथ प्रक्रिया की खोज करता हूं, ऐप में इसे (नाम) सहेजें।
  4. अंत में मैं वेब ब्राउज़र बंद करता हूं।

समस्या यह है कि यदि उपयोगकर्ता ने पहले वेब ब्राउज़र में कुछ टैब खोले थे - बिंदु 1 में। नया टैब जोड़ा गया है और बिंदु 4 में सब कुछ बंद है (सभी टैब के साथ वेब ब्राउज़र)।

क्या आप मुझे बता सकते हैं कि वेब ब्राउजर में एक टैब बंद करने का कोई तरीका है या नहीं? या शायद ओथ के माध्यम से जाने के लिए अन्य/आसान तरीका है?

मैन्युअल समाधान के रूप में मैं बस उपयोगकर्ता को जानकारी दिखाऊंगा "अब आप इस टैब को बंद कर सकते हैं", हालांकि मैं इसे स्वचालित रूप से करना चाहता हूं।

यह सी # नेट 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

विषय पर अधिक: आप इस ब्राउज़र सामान की बजाय मौजूदा सी # ओथ पुस्तकालयों में से एक का उपयोग करने पर विचार कर सकते हैं - उदाहरण के लिए, http://stackoverflow.com/questions/3997172/oauth-2-0 के उत्तर में से एक से -सेवा-प्रदाता-नेट-लाइब्रेरी –

+3

आप मूल 'वेबब्रोसर' नियंत्रण का उपयोग कर इसे अपने एप्लिकेशन में रख सकते हैं। –

उत्तर

0

ऐसा करने के अन्य तरीके हैं जैसे dotnetopenauth। लेकिन यदि आप वास्तव में एक वेब ब्राउज़र का उपयोग करना चाहते हैं, तो मेरा सुझाव है कि आप कार्य के लिए .Net WebBrowser नियंत्रण का उपयोग करें, और इसे बंद करने के लिए निर्धारित करने के लिए Navigated ईवेंट को संभालें।

0

उत्तर देने में बहुत लंबा हो सकता है, लेकिन आज मुझे एक ही समस्या का सामना करना पड़ा और मैं इस तरह से उपयोग करने जा रहा हूं: एक नई ब्राउज़र प्रक्रिया में यूआरएल खोलें। Open a URL in a new browser process

प्रमाणीकरण या जो भी आप चाहते हैं उसके बाद; जैसे मेरे मामले में; जब उपयोगकर्ता ने मेरे डब्ल्यूपीएफ में पिन दर्ज किया; ट्विटर से उत्पन्न, मैं आसानी से व्यक्तिगत प्रक्रिया को बंद कर सकते हैं। इस तरह, आपको एक नई ब्राउज़र प्रक्रिया खोले जाने के बाद अन्य टैब के बारे में चिंता करने की आवश्यकता नहीं है।

0

मैं ब्राउज़र विंडो के लिए CTRL-W भेजकर इस किया है ...

2

के रूप में स्टीफन ली पार्कर का सुझाव दिया, यह वास्तव में एक निश्चित खिड़की करने के लिए एक कीस्ट्रोक भेजने के लिए संभव है। यही है, यह देखते हुए कि आपके पास अपनी ब्राउज़र विंडो के लिए हैंडल है।

इसके अलावा, आपके ब्राउज़र के चयन को अलग टैब बंद करने के लिए हॉटकी का समर्थन करना चाहिए, लेकिन 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

संबंधित मुद्दे