多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

时间:2022-11-26 17:09:51
最近帮客户 做了一个多选项卡的迷你浏览器。

但是发现一个问题,就是当你任意切换选项卡,当前载入的网站页面, 你滚动鼠标的滚轮,右边的滚动条是不会自动激活,没反应的。

这时候,你得点鼠标击页面的空白处 一下,然后 滚轮才能滚动 页面的滚动条。

这个用户体验是非常差的。 我们现在主流的浏览器,都是你切换任意 选项卡,载入的页面都是 立即支持 鼠标滚轮 控制 网页滚动条的。

这个要如何实现呢?

有些人说,你自己写一个 方法,切换页面后, 模拟鼠标 点击一下滚动条,就当是自动帮用户激活 滚轮功能,我认为这是不科学的。

看看大家有什么好主意?

14 个解决方案

#1


当你切换选项卡时
顺便给Web控件设置焦点
应该OK的

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#2


我试过了,不行!

#3


我用了各种焦点。当前选项卡焦点,当前选项卡里面的控件集合焦点,当前窗体焦点。统统不行!都得点一下鼠标!

#4


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://www.qq.com");
            webBrowser2.Navigate("http://www.sina.com.cn");
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TabPage tabPage = tabControl1.TabPages[tabControl1.SelectedIndex];
            foreach(Control c in tabPage.Controls)
            {
                WebBrowser web = c as WebBrowser;
                if (web != null)
                {
                    IntPtr h = FindWindowEx(web.Handle, IntPtr.Zero, "Shell Embedding", "");
                    if (h != IntPtr.Zero)
                    {
                        h = FindWindowEx(h, IntPtr.Zero, "Shell DocObject View", "");
                        if (h != IntPtr.Zero)
                        {
                            h = FindWindowEx(h, IntPtr.Zero, "Internet Explorer_Server", "");
                            if (h != IntPtr.Zero)
                            {
                                SetFocus(h);
                            }
                        }
                    }

                    break;
                }
            }
        }
    }
}


多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#5


好像还有一个Bug
就是
必须得把鼠标放到Web控件才有效


多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#6


楼上的,你的代码牛!!!!

#7


引用 6 楼  的回复:
楼上的,你的代码牛!!!!

牛个屁哦
整天吹水
再不粘点代码
又得关小黑屋了

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#8


楼上的再问你一个问题,我写了一个新窗口事件。很奇怪,如果是用鼠标左键 点击 网页里面的 链接,确确实实是可以打开一个新链接。没问题。 

但是如果是用 鼠标右键 点击链接, 选择 在新窗口中打开,就出错了。我把代码贴给你看看



       #region 临时浏览器产生新窗体事件
        /// <summary>
        /// 临时浏览器产生新窗体事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void tempBrowser_NewWindow(object sender, CancelEventArgs e)
        {


            //生成新的tempBrowser
            WebBrowser tempBrowser = new WebBrowser();
  
            //通过StatusText属性获得新的url
            string NewURL = ((WebBrowser)sender).StatusText;
            //临时浏览器重定向载入到新的url
            tempBrowser.Navigate(NewURL);
            tempBrowser.Dock = DockStyle.Fill;
            //为临时浏览器关联NewWindow等事件
            tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow);
            tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated);
            tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged);
            tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged);
            //生成新的一页
            XtraTabPage TabPage新的一页 = new XtraTabPage();
            //将临时浏览器添加到临时TabPage中
            TabPage新的一页.Controls.Add(tempBrowser);
            //将临时TabPage添加到主窗体中
            tabControl选项卡控件.TabPages.Add(TabPage新的一页);
 
            //使外部无法捕获此事件
            e.Cancel = true;
        }
        #endregion

#9



你想把弹出的新网页
也在你自己的程序上打开?
没仔细看你的代码
但发现一个最重要的问题没处理
没把前一个页面的信息赋给新页面
比如
前一个页面登录成了保存了Cookie了
然后你新开了一个页
又变成了没登录了

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#10


而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#11


我没有拉任何一个 WebBrowser控件到窗体中

都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();

上面的新窗体事件,用鼠标 “左键”点击, 带 _blank  的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。

唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!

#12


而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑


那该如何取得?

#13


这个
不能使得NewWindow事件了
得使用NewWindow2或者Newwindow3事件

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#14


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://www.qq.com");
            webBrowser2.Navigate("http://www.sina.com.cn");
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TabPage tabPage = tabControl1.TabPages[tabControl1.SelectedIndex];
            foreach(Control c in tabPage.Controls)
            {
                WebBrowser web = c as WebBrowser;
                if (web != null)
                {
                    IntPtr h = FindWindowEx(web.Handle, IntPtr.Zero, "Shell Embedding", "");
                    if (h != IntPtr.Zero)
                    {
                        h = FindWindowEx(h, IntPtr.Zero, "Shell DocObject View", "");
                        if (h != IntPtr.Zero)
                        {
                            h = FindWindowEx(h, IntPtr.Zero, "Internet Explorer_Server", "");
                            if (h != IntPtr.Zero)
                            {
                                SetFocus(h);
                            }
                        }
                    }

                    break;
                }
            }
        }
    }
}


这段代码对,WebBrowser 有用,
对于 axWebBrowser 没有。我用的是axWebBrowser

#1


当你切换选项卡时
顺便给Web控件设置焦点
应该OK的

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#2


我试过了,不行!

#3


我用了各种焦点。当前选项卡焦点,当前选项卡里面的控件集合焦点,当前窗体焦点。统统不行!都得点一下鼠标!

#4


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://www.qq.com");
            webBrowser2.Navigate("http://www.sina.com.cn");
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TabPage tabPage = tabControl1.TabPages[tabControl1.SelectedIndex];
            foreach(Control c in tabPage.Controls)
            {
                WebBrowser web = c as WebBrowser;
                if (web != null)
                {
                    IntPtr h = FindWindowEx(web.Handle, IntPtr.Zero, "Shell Embedding", "");
                    if (h != IntPtr.Zero)
                    {
                        h = FindWindowEx(h, IntPtr.Zero, "Shell DocObject View", "");
                        if (h != IntPtr.Zero)
                        {
                            h = FindWindowEx(h, IntPtr.Zero, "Internet Explorer_Server", "");
                            if (h != IntPtr.Zero)
                            {
                                SetFocus(h);
                            }
                        }
                    }

                    break;
                }
            }
        }
    }
}


多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#5


好像还有一个Bug
就是
必须得把鼠标放到Web控件才有效


多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#6


楼上的,你的代码牛!!!!

#7


引用 6 楼  的回复:
楼上的,你的代码牛!!!!

牛个屁哦
整天吹水
再不粘点代码
又得关小黑屋了

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#8


楼上的再问你一个问题,我写了一个新窗口事件。很奇怪,如果是用鼠标左键 点击 网页里面的 链接,确确实实是可以打开一个新链接。没问题。 

但是如果是用 鼠标右键 点击链接, 选择 在新窗口中打开,就出错了。我把代码贴给你看看



       #region 临时浏览器产生新窗体事件
        /// <summary>
        /// 临时浏览器产生新窗体事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void tempBrowser_NewWindow(object sender, CancelEventArgs e)
        {


            //生成新的tempBrowser
            WebBrowser tempBrowser = new WebBrowser();
  
            //通过StatusText属性获得新的url
            string NewURL = ((WebBrowser)sender).StatusText;
            //临时浏览器重定向载入到新的url
            tempBrowser.Navigate(NewURL);
            tempBrowser.Dock = DockStyle.Fill;
            //为临时浏览器关联NewWindow等事件
            tempBrowser.NewWindow += new CancelEventHandler(tempBrowser_NewWindow);
            tempBrowser.Navigated += new WebBrowserNavigatedEventHandler(tempBrowser_Navigated);
            tempBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(tempBrowser_ProgressChanged);
            tempBrowser.StatusTextChanged += new EventHandler(tempBrowser_StatusTextChanged);
            //生成新的一页
            XtraTabPage TabPage新的一页 = new XtraTabPage();
            //将临时浏览器添加到临时TabPage中
            TabPage新的一页.Controls.Add(tempBrowser);
            //将临时TabPage添加到主窗体中
            tabControl选项卡控件.TabPages.Add(TabPage新的一页);
 
            //使外部无法捕获此事件
            e.Cancel = true;
        }
        #endregion

#9



你想把弹出的新网页
也在你自己的程序上打开?
没仔细看你的代码
但发现一个最重要的问题没处理
没把前一个页面的信息赋给新页面
比如
前一个页面登录成了保存了Cookie了
然后你新开了一个页
又变成了没登录了

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#10


而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#11


我没有拉任何一个 WebBrowser控件到窗体中

都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();

上面的新窗体事件,用鼠标 “左键”点击, 带 _blank  的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。

唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!

#12


而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑


那该如何取得?

#13


这个
不能使得NewWindow事件了
得使用NewWindow2或者Newwindow3事件

多选项卡浏览器,切换选项卡时,如何自动激活当前页面的滚动栏

#14


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://www.qq.com");
            webBrowser2.Navigate("http://www.sina.com.cn");
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TabPage tabPage = tabControl1.TabPages[tabControl1.SelectedIndex];
            foreach(Control c in tabPage.Controls)
            {
                WebBrowser web = c as WebBrowser;
                if (web != null)
                {
                    IntPtr h = FindWindowEx(web.Handle, IntPtr.Zero, "Shell Embedding", "");
                    if (h != IntPtr.Zero)
                    {
                        h = FindWindowEx(h, IntPtr.Zero, "Shell DocObject View", "");
                        if (h != IntPtr.Zero)
                        {
                            h = FindWindowEx(h, IntPtr.Zero, "Internet Explorer_Server", "");
                            if (h != IntPtr.Zero)
                            {
                                SetFocus(h);
                            }
                        }
                    }

                    break;
                }
            }
        }
    }
}


这段代码对,WebBrowser 有用,
对于 axWebBrowser 没有。我用的是axWebBrowser