2011-07-01 53 views
3
Process.Start(url); 

每次執行此代碼時,我會在瀏覽器中顯示一個新選項卡,顯示url的內容。 有沒有辦法阻止「新標籤」的行爲,並在每次打開相同的標籤頁/窗口?有沒有辦法阻止此代碼每次打開新的瀏覽器窗口?

(我寧願不使用出於安全原因WebBrowser控件)

我建立一個桌面應用程序:不是ASP.NET

+0

+1:我一直討厭在新窗口中打開瀏覽器的應用程序。 –

+0

我建議不要覆寫用戶的標籤,他們可能會在該標籤中顯示一些重要信息,可能是未發送的電子郵件,或者他們可能正在填寫表單。我明白如果你想避開一個新窗口,但打開一個新標籤是完全合理的。並基於我的測試,這是大多數瀏覽器所做的。 –

+0

嗯。除了這不是一個Web應用程序,這不是我所說的:)我想每次都在同一個命名窗口中打開,以便第一次打開一個新的窗口/選項卡並隨後使用該選項卡。 – Tom

回答

2

我不相信這是可能做到這一點(至少以任何直接的方式)從您的應用程序。當你讓系統通過Process.Start啓動進程時,它由目標應用程序(在這種情況下是瀏覽器)決定它如何處理請求。所以要做到這一點,可能需要調整瀏覽器中的某些設置(例如Chrome)本身。

+0

這就是我所懷疑的。我一直在嘗試像'url = @「這樣的技巧:javascript:void(window.open(''+ url +'''''));」;' - 在firefox中沒有任何運氣 – Tom

+0

@Tom:我目前在工作在幾個應用程序中,出於各種原因,使用Process.Start(或類似的東西),它們都在我的瀏覽器中啓動新的選項卡。我覺得有點煩人,但還沒有找到解決辦法。所以我想我希望我的回答是錯誤的;很高興找到一個好的解決方案。 –

1

從我能理解的,不。

Process.Start()創建一個新的流程服務器端並執行您提供的任何命令作爲參數。大多數瀏覽器會認爲這是對安全性的破壞,從而危及正在運行的流程。

我在這裏假設您使用的是ASP.NET和Web瀏覽器,因此我建議您應該查找客戶端解決方案以打開新選項卡。

<script type="text/javascript"> 
    function runsomestuff() { 
    document.getElementById('mylink').click(); 
    } 
</script> 

<body onload="runsomestuff"> 
... 
<a href="some url" target="_blank" id="mylink" style="display: none;">content of the anchor</a> 
</body> 

請注意,此代碼尚未經過測試。通過使用onclick進行鏈接,您正在強制客戶端瀏覽器確認鏈接的目標。然後瀏覽器可以理清它將如何顯示該鏈接(大多數會做一個新的標籤,但其他人(IE6)會一直打開一個新窗口。)

請專門發佈一些代碼,以便我們可以看到你正在努力實現。

+0

感謝您的有用評論。但是,我正在構建一個桌面應用程序。我已經添加了這個問題。 – Tom

+0

實際上,從winforms POV中,您可以嘗試使用Process Start Info並將參數傳入Process.Start。 (http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx) [http:// msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx) –

+0

是的,我試過。如果瀏覽器首先關閉,那麼可以將引用保存到process.start返回的進程中,然後在啓動新進程之前將其終止。但是,由於各種原因,這種方式效果不佳。 – Tom

1

可能殺掉進程,每次重新開始。

,你應該能夠保持PID爲將來的呼叫。

+0

這種工作方式,但不好,因爲瀏覽器原本是關閉的。每一次。它最終變得緩慢而不可靠。 – Tom

1

當你執行這樣你都在問一個URL Shell爲你做,意思是shell根據瀏覽器註冊來決定瀏覽器,然後交給它這意味着打開一個新窗口,但這取決於接收URL的應用程序。

如果您想要控制此默認行爲,您需要閱讀註冊表中URL處理程序的內容,然後針對每個瀏覽器類型的實現處理例程來定位窗口並告訴其導航。

如果這是煩人的,那麼我會建議,而不是使用WebBrowser控制自己的迷你瀏覽器。我不確定你在這裏有什麼安全問題(因爲它只是使用IE) - 隨時分享。

編輯:
試想想它 - 默認行爲(IE ATLEAST)窗口的ID是任何指定的目標將在同一窗口中重複使用。因此,只需打開一個HTML頁面,在命名窗口中打開您的目標URL,然後關閉臨時HTML框架的窗口。有點像有針對某個窗口名稱的重定向服務。

不能確定,但​​本地的HTML文件可能有權限通過使用類似window.open(URL,「名字」,打開在JS彈出...

+0

這是最有用的答案。其實我最終使用WebBrowser控件。我認爲這是一個開放的HTML頁面方法,但是,它會自動關閉它,因爲網頁只允許在用戶交互時自行關閉,因此會出現問題。 – Tom

+0

我的安全問題只不過是基於它多年來存在的所有漏洞而對IE造成的恐懼。沒有具體的。這將是加載的「野外」網頁,所以只是要小心。但由於似乎並沒有真正回答我的問題,所以我沒有太多選擇。也許我可以在我的主IE瀏覽器中禁用腳本,這將轉到WB控制。 – Tom

0

總之,我不得不說否,並強烈建議不要,如果你真的想完成這個,你會想要考慮市場上的每個網絡瀏覽器,因爲你必須傳遞一個命令行參數給應用程序,並且我確信每個網頁瀏覽器都是

Process.Start(「http://www.someurl.com」)將啓動用戶默認的網頁瀏覽器,因此它可能不是Internet Explorer。此外,相當多的人鄙視當一個程序打開一個網頁時沒有問。更重要的是,如果你完成了這個任務,你想怎麼做,並且用戶以後用這個網頁瀏覽器做了一些重要的事情,那麼這就是你存儲使用的標籤頁/窗口,而且你仍然會遠離那個重要的數據。您可以控制程序的功能,但絕對不是用戶,這是您必須考慮的。

相關問題