2008-10-06 53 views
12

Khi sử dụng điều khiển .NET WebBrowser làm cách nào để bạn mở liên kết trong cửa sổ mới bằng cách sử dụng cùng một phiên (ví dụ: không bắt đầu một phiên ASP.NET mới trên máy chủ), hoặc làm cách nào để bạn nắm bắt sự kiện cửa sổ mới để mở URL trong cùng một điều khiển WebBrowser?System.Windows.Forms.WebBrowser mở liên kết trong cùng cửa sổ hoặc cửa sổ mới với cùng một phiên

Trả lời

19

Tôi chỉ mất một giờ để tìm câu trả lời, vì vậy tôi mặc dù tôi sẽ đăng kết quả ở đây. Bạn có thể sử dụng đối tượng SHDocVwCtl.WebBrowser_V1 để nắm bắt sự kiện NewWindow.

Chú ý: Mã từ http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_21484555.html#discussion

//-------------------------------VB.NET Version:------------------------------- 

Dim WithEvents Web_V1 As SHDocVwCtl.WebBrowser_V1 

Private Sub Form_Load() 
    Set Web_V1 = WebBrowser1.Object 
End Sub 

Private Sub Web_V1_NewWindow(ByVal URL As String, ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant, ByVal Headers As String, Processed As Boolean) 
    Processed = True 
    WebBrowser1.Navigate URL 
End Sub 


//-------------------------------C# Version------------------------------- 

private SHDocVw.WebBrowser_V1 Web_V1; //Interface to expose ActiveX methods 

private void Form1_Load(object sender, EventArgs e) 
{ 
    //Setup Web_V1 interface and register event handler 
    Web_V1 = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance; 
    Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(Web_V1_NewWindow); 
} 

private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData,string Headers, ref bool Processed) 
{ 
    Processed = true; //Stop event from being processed 

    //Code to open in same window 
    this.webBrowser1.Navigate(URL); 

    //Code to open in new window instead of same window 
    //Form1 Popup = new Form1(); 
    //Popup.webBrowser1.Navigate(URL); 
    //Popup.Show(); 
} 
+0

Trong định dạng nào SHDocVw được xác định? Tôi không thể tìm thấy nó trong mshtml.dll ít nhất. –

+4

Tôi nghĩ rằng nó nằm ở% WINDIR% \ system32 \ shdocvw.dll –

+0

Obejet không phải là thành viên của webBrower1 đó là những gì tôi là gettinf –

3

Hơi dọn dẹp phiên bản của câu trả lời của Greg. Nó thay đổi hành vi của điều khiển được truyền vào thay vì dựa vào một biến toàn cầu. Cách sử dụng:

InlinePopups(webBrowser1); 

Code:

// interface to expose ActiveX methods 
private SHDocVw.WebBrowser_V1 Web_V1; 
private void InlinePopups(WebBrowser browser) 
{ 
    // hooks to force new windows to open in the current instance 
    Web_V1 = (SHDocVw.WebBrowser_V1)browser.ActiveXInstance; 
    Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler((string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed) => 
    { 
     Processed = true; // stop event from being processed 

     // open in the existing window 
     browser.Navigate(URL); 
    }); 
} 

Tuy nhiên cần tham chiếu đến% WINDIR% \ system32 \ shdocvw.dll, tất nhiên.

Các vấn đề liên quan