標籤:代碼 exce tac iunknown lin private ace ring manager
為了實現這個功能,可算是折騰不少時間,網上搜素出來的結果基本都是如何屏蔽警告對話方塊。後來請教一個技術大牛(程式員之窗的主要作者Starts_2000),他用C++實現了,他嘗試了下C#也沒有解決,就忙其他的去,大牛時間一般都比較寶貴,後來我就將就用那個C++動態庫,那個時候我測試環境是 win7 64位 +vs2013,後來系統內容變化成 win10 +vs2015,突然就不好使了,趕緊重新編譯C++源碼,各種錯誤,感覺怎麼這麼不穩定。 怎麼辦?總不能再讓別人幫忙,下次環境變化了繼續問別人? 這就要求自己必須用C#實現, 好了 下面進入主題。
WebBrowser請求一個地址,比如http://download.easyicon.net/png/568613/48/ 會出現:
需要達到的目的:在彈出上面對話方塊之前能加入自己的代碼進行控制。如
為了實現這個功能網上找了些資料,發現有些協助的地址:
http://stackoverflow.com/questions/13362922/windows-forms-webbrowswer-control-with-idownloadmanager
遇到相同問題的有下面2個連結:
https://q.cnblogs.com/q/57083/
http://stackoverflow.com/questions/32513190/dllimportregistercallbackpbc-url-and-bindmonikertostreampmk-pbc
看完這些文檔後,我遇到和他們一樣的困擾.主要有下面幾個問題
1 找不到完整程式碼範例,只能東拼西湊的看看
2 在Download方法裡面斷點不進去,當然也就沒有攔截的效果.
3 希望不是所有的下載都需要攔截,有些用IE內建的功能進行下載。
第一個問題: 自己搜尋些代碼加以整理
第二個問題: 我發現主要是自己當時介面定義出錯
[ComImport, Guid("6d5140c1-7436-11ce-8034-00aa006009fa"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(false)] public interface IServiceProvider { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int QueryService(ref Guid guidService, ref Guid riid,
/*[MarshalAs(UnmanagedType.Interface)]*/ IntPtr ppvObject); }
刪除注釋部分即可,如果還有不進斷點的請參照完整原始碼。
第三問題 需要系統API,也有不少人不知道怎麼定義這個API,比如上面連結就有個老外再問, API定義如下:
internal class API { [DllImport("ole32.dll")] internal static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc); [DllImport("ole32.dll")] internal static extern int RegisterCallback(IBindCtx pbc, Uri url); [DllImport("ole32.dll")] internal static extern int BindMonikerToStream(IMoniker pmk, IBindCtx ppbc); }
測試發現 只需要調用 第二個或者第三個API即可實現IE內建下載。
部分代碼如下:
private void DownLoadDemo() { try { DownLoadWebBrowser DownLoadWebBrowser = new DownLoadWebBrowser(); DownLoadWebBrowser.FileDownloading += DownLoadWebBrowser_FileDownloading; DownLoadWebBrowser.Navigate(downLoadUrl); } catch (Exception) { throw; } } private void DownLoadWebBrowser_FileDownloading(object sender, FileDownloadEventArgs e) { string info = string.Format("{0},是否繼續", e.Url.ToString()); bool downLoad = MessageBox.Show(info, "請選擇", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No; e.Cancel = downLoad; }
完整代碼下載。
原始碼除了攔截下載,其他的一些功能(屏蔽對話方塊、JS和C#代碼互相調用,以及IE版本等等)也附帶上了,主要是之前寫的,就懶的去掉。
C#WebBrowrse攔截下載對話方塊