Zoom in on a web page using WebBrowser .NET control

后端 未结 6 920
小鲜肉
小鲜肉 2020-11-30 04:23

In IE7 there\'s a \"zoom\" feature built-in (show in the status bar), allowing you to zoom in up to 400%. I\'m using the WebBrowser .NET control in a demo/simulation app, an

相关标签:
6条回答
  • 2020-11-30 04:41

    There appears to be a solution at IE Zoom that involves overriding AttachInterfaces and DetachInterfaces in the WebBrowser to get a IWebBrowser2 interface, and then calling ExecWB with OLECMDID_OPTICAL_ZOOM.

    I've tried his sample code and it appears to work; the (abridged) relevant class looks like this:

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace ZoomBrowser
    {
        public partial class MyBrowser : WebBrowser
        {
            #region enums
            public enum OLECMDID
            {
                // ...
                OLECMDID_OPTICAL_ZOOM = 63,
                OLECMDID_OPTICAL_GETZOOMRANGE = 64,
                // ...
            }
    
            public enum OLECMDEXECOPT
            {
                // ...
                OLECMDEXECOPT_DONTPROMPTUSER,
                // ...
            }
    
            public enum OLECMDF
            {
                // ...
                OLECMDF_SUPPORTED = 1
            }
            #endregion
    
            #region IWebBrowser2
            [ComImport, /*SuppressUnmanagedCodeSecurity,*/
             TypeLibType(TypeLibTypeFlags.FOleAutomation | 
                         TypeLibTypeFlags.FDual |       
                         TypeLibTypeFlags.FHidden), 
             Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E")]
            public interface IWebBrowser2
            {
                [DispId(100)]  void GoBack();
                [DispId(0x65)] void GoForward();
                [DispId(0x66)] void GoHome();
                [DispId(0x67)] void GoSearch();
                [DispId(0x68)] void Navigate([In] string Url, 
                                             [In] ref object flags, 
                                             [In] ref object targetFrameName, 
                                             [In] ref object postData, 
                                             [In] ref object headers);
                [DispId(-550)] void Refresh();
                [DispId(0x69)] void Refresh2([In] ref object level);
                [DispId(0x6a)] void Stop();
                [DispId(200)]  object Application 
                               { [return: 
                                  MarshalAs(UnmanagedType.IDispatch)] get; }
                [DispId(0xc9)] object Parent 
                               { [return: 
                                  MarshalAs(UnmanagedType.IDispatch)] get; }
                [DispId(0xca)] object Container 
                               { [return: 
                                  MarshalAs(UnmanagedType.IDispatch)] get; }
                [DispId(0xcb)] object Document 
                               { [return: 
                                  MarshalAs(UnmanagedType.IDispatch)] get; }
                [DispId(0xcc)] bool TopLevelContainer { get; }
                [DispId(0xcd)] string Type { get; }
                [DispId(0xce)] int Left { get; set; }
                [DispId(0xcf)] int Top { get; set; }
                [DispId(0xd0)] int Width { get; set; }
                [DispId(0xd1)] int Height { get; set; }
                [DispId(210)]  string LocationName { get; }
                [DispId(0xd3)] string LocationURL { get; }
                [DispId(0xd4)] bool Busy { get; }
                [DispId(300)]  void Quit();
                [DispId(0x12d)] void ClientToWindow(out int pcx, out int pcy);
                [DispId(0x12e)] void PutProperty([In] string property, 
                                                 [In] object vtValue);
                [DispId(0x12f)] object GetProperty([In] string property);
                [DispId(0)] string Name { get; }
                [DispId(-515)] int HWND { get; }
                [DispId(400)] string FullName { get; }
                [DispId(0x191)] string Path { get; }
                [DispId(0x192)] bool Visible { get; set; }
                [DispId(0x193)] bool StatusBar { get; set; }
                [DispId(0x194)] string StatusText { get; set; }
                [DispId(0x195)] int ToolBar { get; set; }
                [DispId(0x196)] bool MenuBar { get; set; }
                [DispId(0x197)] bool FullScreen { get; set; }
                [DispId(500)] void Navigate2([In] ref object URL, 
                                             [In] ref object flags, 
                                             [In] ref object targetFrameName, 
                                             [In] ref object postData, 
                                             [In] ref object headers);
                [DispId(0x1f5)] OLECMDF QueryStatusWB([In] OLECMDID cmdID);
                [DispId(0x1f6)] void ExecWB([In] OLECMDID cmdID, 
                                            [In] OLECMDEXECOPT cmdexecopt, 
                                            ref object pvaIn, IntPtr pvaOut);
                [DispId(0x1f7)] void ShowBrowserBar([In] ref object pvaClsid, 
                                                    [In] ref object pvarShow, 
                                                    [In] ref object pvarSize);
                [DispId(-525)] WebBrowserReadyState ReadyState { get; }
                [DispId(550)] bool Offline { get; set; }
                [DispId(0x227)] bool Silent { get; set; }
                [DispId(0x228)] bool RegisterAsBrowser { get; set; }
                [DispId(0x229)] bool RegisterAsDropTarget { get; set; }
                [DispId(0x22a)] bool TheaterMode { get; set; }
                [DispId(0x22b)] bool AddressBar { get; set; }
                [DispId(0x22c)] bool Resizable { get; set; }
            }
            #endregion
    
            private IWebBrowser2 axIWebBrowser2;
    
            public MyBrowser()
            {           
            }
    
            protected override void AttachInterfaces(
                object nativeActiveXObject)
            {
                base.AttachInterfaces(nativeActiveXObject);
                this.axIWebBrowser2 = (IWebBrowser2)nativeActiveXObject;
            }
    
            protected override void DetachInterfaces()
            {
                base.DetachInterfaces();
                this.axIWebBrowser2 = null;
            }
    
            public void Zoom(int factor)
            {
                object pvaIn = factor;
                try
                {
                    this.axIWebBrowser2.ExecWB(OLECMDID.OLECMDID_OPTICAL_ZOOM,
                       OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, 
                       ref pvaIn, IntPtr.Zero);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 04:50

    This works for me:

    int zoomFactor = 300;
    ((SHDocVw.WebBrowser)webBrowser1.ActiveXInstance).ExecWB(SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM,
        SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, zoomFactor, IntPtr.Zero);

    It seems this can be done only after the document has been loaded.

    0 讨论(0)
  • 2020-11-30 04:59

    For anybody that runs into the same issue as I did, here is a modification to Gloupi's answer that should work on more international systems where the plus and minus keys are in different locations by using the numpad sign keys. This also fixes the zoom in and out on dvorak layouts.

    // zoom in
    webBrowser1.Focus();
    SendKeys.Send("^{ADD}");
    
    // zoom out
    webBrowser1.Focus();
    SendKeys.Send("^{SUBTRACT}");
    
    // zoom reset
    webBrowser1.Focus();
    SendKeys.Send("^0");
    
    0 讨论(0)
  • 2020-11-30 05:00

    Note that the factor value that you pass in to the Zoom function assumes that a value of 100 corresponds to the "normal" size of the web page. Higher values of the factor means you're "zooming in", so the page looks larger. Smaller values of the factor means you're "zooming out", so the page looks smaller. I found that a reasonable increment between factors is 10.

    0 讨论(0)
  • 2020-11-30 05:01

    Easy tip:

    //Zoom IN
    webBrowser1.Focus();
    SendKeys.Send("^{+}"); // [CTRL]+[+]
    
    //Zoom OUT
    webBrowser1.Focus();
    SendKeys.Send("^-"); // [CTRL]+[-]
    
    //Zoom 100%
    webBrowser1.Focus();
    SendKeys.Send("^0"); // [CTRL]+[0]
    
    0 讨论(0)
  • 2020-11-30 05:01

    You can use CSS:

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.Document.Body.Style = "zoom:50%";
        }
    
    0 讨论(0)
提交回复
热议问题