但是发现一个问题,就是当你任意切换选项卡,当前载入的网站页面, 你滚动鼠标的滚轮,右边的滚动条是不会自动激活,没反应的。
这时候,你得点鼠标击页面的空白处 一下,然后 滚轮才能滚动 页面的滚动条。
这个用户体验是非常差的。 我们现在主流的浏览器,都是你切换任意 选项卡,载入的页面都是 立即支持 鼠标滚轮 控制 网页滚动条的。
这个要如何实现呢?
有些人说,你自己写一个 方法,切换页面后, 模拟鼠标 点击一下滚动条,就当是自动帮用户激活 滚轮功能,我认为这是不科学的。
看看大家有什么好主意?
14 个解决方案
#1
当你切换选项卡时
顺便给Web控件设置焦点
应该OK的
顺便给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控件才有效
就是
必须得把鼠标放到Web控件才有效
#6
楼上的,你的代码牛!!!!
#7
牛个屁哦
整天吹水
再不粘点代码
又得关小黑屋了
#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
但是如果是用 鼠标右键 点击链接, 选择 在新窗口中打开,就出错了。我把代码贴给你看看
#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了
然后你新开了一个页
又变成了没登录了
你想把弹出的新网页
也在你自己的程序上打开?
没仔细看你的代码
但发现一个最重要的问题没处理
没把前一个页面的信息赋给新页面
比如
前一个页面登录成了保存了Cookie了
然后你新开了一个页
又变成了没登录了
#10
而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑
来取URL
必死无疑
#11
我没有拉任何一个 WebBrowser控件到窗体中
都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();
上面的新窗体事件,用鼠标 “左键”点击, 带 _blank 的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。
唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!
都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();
上面的新窗体事件,用鼠标 “左键”点击, 带 _blank 的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。
唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!
#12
而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑
那该如何取得?
来取URL
必死无疑
那该如何取得?
#13
这个
不能使得NewWindow事件了
得使用NewWindow2或者Newwindow3事件
不能使得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
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的
顺便给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控件才有效
就是
必须得把鼠标放到Web控件才有效
#6
楼上的,你的代码牛!!!!
#7
牛个屁哦
整天吹水
再不粘点代码
又得关小黑屋了
#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
但是如果是用 鼠标右键 点击链接, 选择 在新窗口中打开,就出错了。我把代码贴给你看看
#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了
然后你新开了一个页
又变成了没登录了
你想把弹出的新网页
也在你自己的程序上打开?
没仔细看你的代码
但发现一个最重要的问题没处理
没把前一个页面的信息赋给新页面
比如
前一个页面登录成了保存了Cookie了
然后你新开了一个页
又变成了没登录了
#10
而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑
来取URL
必死无疑
#11
我没有拉任何一个 WebBrowser控件到窗体中
都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();
上面的新窗体事件,用鼠标 “左键”点击, 带 _blank 的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。
唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!
都是用代码new出来的,这样好绑定选项卡WebBrowser tempBrowser = new WebBrowser();
上面的新窗体事件,用鼠标 “左键”点击, 带 _blank 的链接,都会在自己的窗体,新建一个 tab选项卡加载 新的窗口。
唯一的缺陷就是 如果是 鼠标“右键”点击链接,选择 新窗口打开, 就打不开,而且会出错!
#12
而且你使用string NewURL = ((WebBrowser)sender).StatusText;
来取URL
必死无疑
那该如何取得?
来取URL
必死无疑
那该如何取得?
#13
这个
不能使得NewWindow事件了
得使用NewWindow2或者Newwindow3事件
不能使得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
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