c# WebBrowser开发参考资料
http://hi.baidu.com/motiansen/blog/item/9e99a518233ca3b24aedbca9.html private void btnScriptEvent_Click(object sender, EventArgs e) string szWebBrowserText = "<html>" + webBrowser1.DocumentText = szWebBrowserText; MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading); MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); } = szWebBrowserText; ================================== - 或 - 设置该属性时指定的值为非 COM 可见的类型的实例。有关更多信息,请参见 Marshal.IsTypeVisibleFromCom。 备注 应用程序代码集成在一起。为该属性指定的对象可作为 window.external 对象(用于主机访问的内置 DOM 对象)用于网页脚本。 可以将此属性设置为希望其公共属性和方法可用于脚本代码的任何 COM 可见的对象。可以通过使用 ComVisibleAttribute 对类进行标记使其成为 COM 可见的类。 若要从客户端应用程序代码调用网页中定义的函数,请使用可从 Document 属性检索的 HtmlDocument 对象的 HtmlDocument.InvokeScript 方法。 示例 --------- using System; [PermissionSet(SecurityAction.Demand, )] [STAThread] public Form1() private void Form1_Load(object sender, EventArgs e) webBrowser1.DocumentText = public void Test(String message) private void button1_Click(object sender, EventArgs e) } --------------------------------------------- // Navigates to the URL in the address box when // Navigates to the given URL if it is valid. // Updates the URL in TextBoxAddress upon navigation. ==================================================================================== 属性或方法(如 IHTMLElement),可以使用此对象查询它们。 为了使用非托管接口,需要将 MSHTML 库 (mshtml.dll) 导入到应用程序中。但是,也可以使用 Invoke 方法执行未公开属性和方法。 示例 WebBrowser1 的 WebBrowser 控件,并假定已经以引用的形式将非托管 MSHTML 库添加到项目中。 C# 复制代码 mshtml.IHTMLDocument2 iDoc = (mshtml.IHTMLDocument2)webBrowser1.Document.DomDocument; if (iDoc != null) mshtml.IHTMLTxtRange txtRange = (mshtml.IHTMLTxtRange)iSelect.createRange(); // Create the link. http://msdn.microsoft.com/zh-cn/library/system.windows.forms.htmlelement.domelement(VS.80).aspx =========================================================== 我对于webbrowser的使用并不很清楚,这个空间是否能直接获取html代码呢? 有谁能给出说明和源代码,感激不尽。 页面的html显示了很多遍。如果页面内容较大则会引起程序死掉。 private void button2_Click(object sender, System.EventArgs e) { ============= 1、定义 IOleCommandTarget 接口 为定义一个.NET接口以获得关于一个COM接口的参考,请遵从下列步骤: 1) 赋予.NET接口相应的COM接口的GUID值; 2) 包含对接口中所有方法的类型声明; 3) 包含对Mshtml.dll和Shdocvw.dll文件的参考,在Visual C# .NET工程中操作,请遵从: A. 在项目菜单下单击“添加引用”; B. 单击“COM” 选项卡; C. 双击“Microsoft HTML Object Library” 和“Microsoft Internet Controls”。 |
C# WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
2011-06-18 11:45:39| 分类: .net相关 | 标签: |字号大中小 订阅
从 VS2005开始,VS自带的 WebBrowser控件,就已经相当友好了,可控性非常高了。 Winform 结合 WebBrowser 做UI开发,也是一种非常流畅的模式了, 微软的VS IDE 系列的安装程序, 基本都是这个模式的 在使用WebBrowser做UI的时候,我们有时不希望里面的链接被用户点击,更不希望弹出烦人的脚本错误提示框,也不希望用户能点出右键的IE菜单,要做到这些,其实都是很easy地… 禁用错误脚本提示 将 WebBrowser控件的 ScriptErrorsSuppressed 设为 true 禁用右键菜单 将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false 禁用快捷键 将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false 禁用超链接 超链接分为两种,一种是 当前窗口直接转向, 一种是 在新窗口中打开 当然窗口直接转向: 将 WebBrowser 的 AllowNavigation 设为 false 在新窗口中打开: 禁用新窗口打开,需要处理 WebBrowser 的 NewWindow 事件 做完上面的工作,基本就完工了,还有最后一点需要注意,那就是 Drag-And-Drop 记得将 WebBrowser 的 AllowWebBrowserDrop 设为 false |
1 取得当前行号、列号。
int row=e.Row;
int count=e.Count;
或者:
int rowindex = fpSpread1.ActiveSheet.ActiveRowIndex;
int columnindex = fpSpread1.ActiveSheet.ActiveColumnIndex;
2 单击一行变颜色。
private void spdResult_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
{
//单击Spread列头时,什么也不处理
if(!e.ColumnHeader)
{
if(spdResult.Sheets[0].Rows.Count!=0)
{
for(int i=0;i<spdResult.Sheets[0].Rows.Count;i++)
{
spdResult.Sheets[0].Rows[i].BackColor=System.Drawing.Color.White;
}
int row=e.Row;
spdResult.Sheets[0].Rows[row].BackColor=System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(255)), ((System.Byte)(255)));
}
}
}
3 将Spread的单元格内容付值给一控件的Text
txtItemCD.Text = spdResult.Sheets[0].Cells[row,count].Text;
4 给Spread的指定单元格付值。
spdResult.Sheets[0].Cells[row,count].Text = txtItemCD.Text;
5 通过上下光标键改变选中行颜色
private void spdResult_LeaveCell(object sender, FarPoint.Win.Spread.LeaveCellEventArgs e)
{
//首先检查spread行数是否为0
if(spdResult.Sheets[0].Rows.Count==0)
{
return;
}
else
{
for(int i=0;i<spdResult.Sheets[0].Rows.Count;i++)
{
spdResult.Sheets[0].Rows[i].BackColor=System.Drawing.Color.White;
}
int row=e.NewRow;
spdResult.Sheets[0].Rows[row].BackColor=System.Drawing.Color.FromArgb(((System.Byte)(192)), ((System.Byte)(255)), ((System.Byte)(255)));
}
}
6 下拉列表加载数据(ComBobox)
・ 列表追加(适合于数据量少的情况)
FarPoint.Win.Spread.CellType.ComboBoxCellType cb4 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
cb4.ListWidth = 96;
cb4.Editable = true;
cb4.MaxDrop = 10;
cb4.MaxLength = 1;
string[] priceTagList = new string[]{" 0 无"," 1 有"};
cb4.Items = priceTagList;
this.spdSetList.ActiveSheet.Columns[4].CellType = cb4;
・ 从数据库追加
FarPoint.Win.Spread.CellType.ComboBoxCellType cb12 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
cb12.ListWidth = 150;
cb12.Editable = true;
cb12.MaxDrop = 10;
cb12.MaxLength = 8;
//dsEmployee:数据集Dataset,已经加载好数据的Dataset
string[] employeeList = DataSetToArray(dsEmployee, 8);
cb12.Items = employeeList;
this.spdSetList.ActiveSheet.Columns[12].CellType = cb12;
private string[] DataSetToArray(DataSet ds, int BlankNum)
{
int i = 0;
int NumLength = 0;
string[] returnArray = new string[ds.Tables[0].Rows.Count];
DataRow foundRows = ds.Tables[0].Rows[ds.Tables[0].Rows.Count -1];
NumLength = foundRows[0].ToString().Length;
foreach(DataRow dr in ds.Tables[0].Rows)
{
returnArray[i] = dr[0].ToString().PadLeft(BlankNum, ' ') + " " + dr[1].ToString();
i++;
}
return returnArray;
}
7 Focus移动(跨列)
public frmProdSetDetail()
{
InitializeComponent();
IsMod = flag;
FarPoint.Win.Spread.InputMap im;
im = spdResult.GetInputMap(InputMapMode.WhenFocused);
im.Put(new Keystroke(Keys.Enter,Keys.None),SpreadActions.MoveToNextColumnWrap);
im.Put(new Keystroke(Keys.Tab,Keys.None),SpreadActions.MoveToNextColumnWrap);
im = spdResult.GetInputMap(InputMapMode.WhenAncestorOfFocused);
im.Put(new Keystroke(Keys.Enter,Keys.None),SpreadActions.MoveToNextColumnWrap);
im.Put(new Keystroke(Keys.Tab,Keys.None),SpreadActions.MoveToNextColumnWrap);
}
指定单元格获得焦点
this.fpSpread1.ActiveSheet.SetActiveCell(row,column);
8 事件触发顺序
_Enter _EnterCell _EditModeOn _EditChange _EditModeOff _LeaveCell
9 用隐藏列保存原始数据
10 设定列类型
private void SpreadSetting()
{
string[] ProductHandleTypeList = new string[]{" ","1 販売/仕入","2 販売","3 仕入"};
FarPoint.Win.Spread.CellType.ComboBoxCellType cb3 = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
cb3.ListWidth = 100;
cb3.Editable = true;
cb3.MaxDrop = 5;
cb3.MaxLength = 1;
cb3.Items = ProductHandleTypeList;
this.spdResult.ActiveSheet.Columns[5].CellType = cb3;
//设置一般数据型
FarPoint.Win.Spread.CellType.NumberCellType nmbrcell = new FarPoint.Win.Spread.CellType.NumberCellType();
nmbrcell.ShowSeparator = false;
nmbrcell.DecimalPlaces = 0;
nmbrcell.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
nmbrcell.MaximumValue = 9999;
nmbrcell.MinimumValue = 1;
this.spdResult.ActiveSheet.Columns[13].CellType = nmbrcell;
//设置JAN
FarPoint.Win.Spread.CellType.NumberCellType nmbrcellJan = new FarPoint.Win.Spread.CellType.NumberCellType();
nmbrcellJan.ShowSeparator = false;
nmbrcellJan.DecimalPlaces = 0;
nmbrcellJan.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
nmbrcellJan.MaximumValue = 9999999999999;
nmbrcellJan.MinimumValue = 0;
this.fpSpread1.ActiveSheet.Columns[0].CellType = nmbrcellJan;
this.fpSpread1.ActiveSheet.Columns[0].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Left;
//
FarPoint.Win.Spread.CellType.NumberCellType numberCellType1 = new FarPoint.Win.Spread.CellType.NumberCellType();
numberCellType1.ShowSeparator = true;
numberCellType1.DecimalPlaces = 0;
numberCellType1.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.UseRegional;
numberCellType1.MaximumValue = 99999999;
numberCellType1.MinimumValue = 0;
this.spdResult.ActiveSheet.Columns[20].CellType = numberCellType1;
//%数的设定
FarPoint.Win.Spread.CellType.PercentCellType prctcell = new FarPoint.Win.Spread.CellType.PercentCellType();
prctcell.PercentSign = "%";
this.spdResult.ActiveSheet.Columns[33].CellType = prctcell;
//日期的设定
FarPoint.Win.Spread.CellType.DateTimeCellType datecell = new FarPoint.Win.Spread.CellType.DateTimeCellType();
datecell.MaximumDate = new System.DateTime(2050, 12, 31, 0, 0, 0, 0);
datecell.MinimumDate = new System.DateTime(2001, 1, 1, 0, 0, 0, 0);
this.spdResult.ActiveSheet.Columns[27,30].CellType = datecell;
}
11 列、单元格锁定
//锁定
this.fpSpread1.ActiveSheet.Columns[0,4].Locked = true;//锁定列范围
this.fpSpread1.ActiveSheet.Columns[0].Locked = true;//锁定单列
//解锁
this.fpSpread1.ActiveSheet.Columns[0,4].Locked = false;//解锁列范围
this.fpSpread1.ActiveSheet.Columns[0].Locked = false;
12 Spread追加行、列
//追加行
int rowindex = this.fpSpread1.ActiveSheet.Rows.Count;
this.fpSpread1.ActiveSheet.Rows.Add(rowindex,1);
//追加列
int columnindex = this.fpSpread1.ActiveSheet.Columns.Count;
this.fpSpread1.ActiveSheet.Columns.Add(columnindex,1);
13 行、列删除
//删除行
this.fpSpread1.ActiveSheet.Rows.Remove(startindex,count);
//追加列
this.fpSpread1.ActiveSheet.Columns.Remove(startindex,count);
14 button事件
private void spdSetList_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
{
int rowCount = e.Row;
int columnCount = e.Column;
if (e.Column == 16)
{
if (message.ShowMessage("ConfirmDelete", "選択したライン") == DialogResult.Yes)
{
string DeleteTag = this.spdSetList.ActiveSheet.Cells[rowCount, columnCount+1].Text.Trim();
if (DeleteTag == "0" || DeleteTag == "2")
{
this.spdSetList.ActiveSheet.Cells[rowCount, columnCount+1].Text = "3";
this.spdSetList.ActiveSheet.Cells[rowCount,columnCount+1].BackColor = clrWater;
this.spdSetList.ActiveSheet.Rows[rowCount].Visible = false;
}
else if (DeleteTag == "1")
{
this.spdSetList.ActiveSheet.Rows[rowCount].Remove();
}
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiezigege/archive/2009/08/26/4486642.aspx
前面已经讲过了WebBrowser的简单用法,下面依一个具体的应用实例来说明下WebBrowser:
这个实例是以读取移动交费中间商连连的交费页面进行自动交费的应用,其整体思路是从已有的数据库中读取数据做为交费信息连续像移动官方提交数据:
一、首先在winform窗体中拖入WebBrowser控件命名为webPage并设置其屏蔽js脚本错误的属性。在load事件中:
this.webPage.Navigate("连连官方交费网址");
这样当页面打开我们就进入了连连官方交费网站的登录页面。输入用户信息和密码,相关的验证信息即可进入个人页面。
二、加入一个按钮当我们单击这个按钮时就开始程序进行交费,这个过程我用了一个时间线程控件命名为timer1.其单击事件代码:
代码
if (tsbtnstart.Text == "开始")
{
timer1.Enabled = true;
t2 = true;
tsbtnstart.Text = "停止";
t11 = true;
}
else
{
timer1.Enabled = false;
tsbtnstart.Text = "开始";
t2 = false;
t11 = false;
}
其中t2,t11分别为两个bool变量做为timer1是否开启的标识,下面会用到,这里不再多说。现在timer1已经开始读取数据,下面是timer1执行的事件:
代码
private void timer1_Tick(object sender, EventArgs e)
{
try
{
//如果timer2正在运行
while (timer2.Enabled)
{
System.Threading.Thread.Sleep(500);
};
}
catch (Exception)
{
}
//充值提交运行结果
string state = "";
//数据库信息
string orderstr = "";
try
{
//从数据库中读取充值信息,并完成扣费,将其状态改为正在充值,并返回该条信息的编号,号码,金额用"_"隔开
orderstr = ifiobj.goulstrll(str1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//如果数据不为空
if (orderstr != "")
{
//将结果截取成数组
string[] strorder = orderstr.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length == 3)
{
//编号
ormid = strorder[0].ToString();
//号码
ormnum = strorder[1].ToString();
//金额
ormmoney = strorder[2].ToString();
}
//如果没有数据
if (ormid == "0" && ormnum == "0")
{
return;
}
//如果提交该条数据的用户余额不足
else if (ormid == "0" && ormnum == "1")
{
return;
}
else
{
//调用远程页面提交数据充值
state = submittoweb(ormid, ormnum, ormmoney);
//如果返回结果为over则中断程序
if (state == "over")
{
timer1.Enabled = false;
t2 = false;
t22 = false;
MessageBox.Show("号码:" + ormnum + "充值:" + ormmoney + "元失败,由于已经提前扣费,系统已经终止运行,请对提交该业务的营业厅进行返账操作后,点击确定继续运行。", "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
timer1.Enabled = true;
t2 = true;
t22 = true;
return;
}
else if (state == "continue")
{
//timer2开启,timer2关闭
islock = 1;
timer1.Enabled = false;
t22 = true;
t11 = false;
timer2.Enabled = true;
}
else
{
databind(ormid, ormnum, ormmoney, "充值失败", 0);
return;
}
//}
}
}
}
这段代码中出现了timer2时间控件当timer1已经成功提交了一笔交费信息时关闭它,并同时打开timer2对页面进行不间断的读取当获得成功反馈信息时将timer1提交的数据记录为成功否则失败。其中的t22和t11一样是用来标识timer2的。下面是对提取的数据进行网页提交submittoweb函数:
代码
private string submittoweb(string ormid1,string ormnum1, string ormmoney1)
{
try
{
//页面元素读取,读取框架tabWin中的内容
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//用户号码
HtmlElement usernum = doc.All["custsimno"];
//重复输入
HtmlElement usernum1 = doc.All["custsimno1"];
//充值金额
HtmlElement usermoney = doc.All["pay"];
//代理商密码
HtmlElement userpwd = doc.All["agtpwd"];
//提交按钮
HtmlElement formbtn = doc.All["confirm"];
if (usernum == null || usermoney == null || formbtn == null || usernum1 == null || userpwd == null)
{
//如果页面读取出错
databind(ormid, ormnum, ormmoney, "连连充值失败提交冲正", 0);
return "continue";
}
//对页面内容进行赋值
usernum.SetAttribute("value", ormnum);
usernum1.SetAttribute("value", ormnum);
usermoney.SetAttribute("value", ormmoney);
userpwd.SetAttribute("value", str);
//执行提交按钮
formbtn.InvokeMember("click");
//执行js代码
doc.InvokeScript("SubmitbtnSave");
}
catch
{
}
return "continue";
}
这段代码就不用多讲了接着timer1的事件,当执行完上面这段代码后如果顺利完成就返回:continue字符从面启动timer2关闭timer1否则返回over结束timer1等待人式处理
下面是timer2的事件代码:
代码
private void timer2_Tick(object sender, EventArgs e)
{
//如果timer1正在运行
if (timer1.Enabled)
{
//timer2.Enabled = false;
return;
}
string innerText = "";
try
{
//获取页面集合
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//读取页面form中的内容
innerText = doc.GetElementById("frmEdit").InnerText;
}
catch
{
throw;
}
//对读取出的内容进行截取
string[] strorder = innerText.Split(new string[] { "用户姓名", "充值金额", "代理钱包余额", "冻结钱包余额" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length <5)
{
return;
}
else
{
strorder[4].Replace(" ", "");
//如果剩余金额不为空
if (strorder[4].ToString() != "\r\n")
{
strorder[2].Replace("\r\n", "");
strorder[2].Replace(" ", "");
strorder[4].Replace(" ", "");
if (strorder[4].ToString() == "\r\n"||strorder[2].ToString()=="")
return;
if (allmoney !=strorder[4].ToString())
{
strorder[4].Replace("\r\n", "");
strorder[4].Replace(",", "");
strorder[4].Replace(",", "");
//记录下用户名和金额
allmoney = strorder[4].ToString();
username = strorder[2].ToString();
//交易计数
nums++;
//进行数据记录,显示在listview中
databind(ormid, ormnum, ormmoney, "充值成功", 1);
//timer2关闭
timer2.Enabled = false;
//timer2关闭
//islock = 0;
t22 = false;
t11 = true;
timer1.Enabled = true;
}
else
return;
}
else
return;
}
}
这样整体的流程就完成了,可是当我们人工提交充值信息成功时官方会从服务器返回一个js的成功提示框,这样整个程序将被终止,如何处理,在网上看了好多例子结果没有合适的,就自己试了一下,着手点还是webBrowser控件的两个事件不再多说,前面已经讲过:
代码
private void webPage_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//屏蔽js窗体
if (islock==1)
{
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function alert() {return '';}";
win.execScript(s, "javascript");
}
catch
{
}
}
count++;
}
代码
private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webPage.ReadyState < WebBrowserReadyState.Complete)
return;
////屏蔽js窗体
if (webPage.DocumentText.IndexOf("window.open(") > -1 || webPage.DocumentText.IndexOf("window.close()") > -1)
{
webPage.DocumentText = webPage.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");
}
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function confirm() {";
s += "return true;";
s += "}";
s += "function alert(str) {return '';}";
win.execScript(s, "javascript");
string s1 = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
win.execScript(s1, "javascript");
}
catch
{
throw;
}
count--;
//判断页面是否加载完成count=0
if (count == 0 && t2)
{
//开启timer进行数据库信息读取
if (t11)
{
if (timer1.Enabled && timer2.Enabled)
timer2.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = true;
}
}
//开启timer2进行页面信息读取
else if (t22)
{
if (timer1.Enabled && timer2.Enabled)
timer1.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer2.Enabled = true;
}
else
{
timer2.Enabled = true;
}
}
else
{
}
}
}这两段代码中有些冗余,没有清除,如果需要可以自己试着清除。
完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using mshtml;
namespace Demo
{
public partial class ForthForm : Form
{
llifi.Service1SoapClient ifiobj = new Demo.llifi.Service1SoapClient();
//验证
private string str1 = "*******";
//代理密码
private string str = "******";
//如果交费成功屏蔽js标识
private int islock = 0;
//账户余额
private string allmoney = "\r\n";
//充值用户
private string username = "";
//交易数量
private int nums = 0;
//页面刷新完成标识
private int count = 0;
//timer1标识
private bool t11 = false;
//程序是否开启标识
private bool t2 = true;
//timer2标识
private bool t22 = false;
//交易编号
private string ormid = "";
//交易号码
private string ormnum = "";
//交易金额
private string ormmoney = "";
public ForthForm()
{
InitializeComponent();
}
private void tsbtnNavigate_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.tscboURL.Text))
{
MessageBox.Show("No URL was checked!");
return;
}
else if (this.tscboURL.Text == "河南连连科技")
{
this.webPage.Navigate("l连连网");
tsbtnstart.Enabled = true;
}
else
{
}
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
if (tsbtnstart.Text == "开始")
{
timer1.Enabled = true;
t2 = true;
tsbtnstart.Text = "停止";
t11 = true;
}
else
{
timer1.Enabled = false;
tsbtnstart.Text = "开始";
t2 = false;
t11 = false;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
try
{
//如果timer2正在运行
while (timer2.Enabled)
{
System.Threading.Thread.Sleep(500);
};
}
catch (Exception)
{
}
//充值提交运行结果
string state = "";
//数据库信息
string orderstr = "";
try
{
//从数据库中读取充值信息,并完成扣费,将其状态改为正在充值,并返回该条信息的编号,号码,金额用"_"隔开
orderstr = ifiobj.goulstrll(str1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//如果数据不为空
if (orderstr != "")
{
//将结果截取成数组
string[] strorder = orderstr.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length == 3)
{
//编号
ormid = strorder[0].ToString();
//号码
ormnum = strorder[1].ToString();
//金额
ormmoney = strorder[2].ToString();
}
//如果没有数据
if (ormid == "0" && ormnum == "0")
{
return;
}
//如果提交该条数据的用户余额不足
else if (ormid == "0" && ormnum == "1")
{
return;
}
else
{
//调用远程页面提交数据充值
state = submittoweb(ormid, ormnum, ormmoney);
//如果返回结果为over则中断程序
if (state == "over")
{
timer1.Enabled = false;
t2 = false;
t22 = false;
MessageBox.Show("号码:" + ormnum + "充值:" + ormmoney + "元失败,由于已经提前扣费,系统已经终止运行,请对提交该业务的营业厅进行返账操作后,点击确定继续运行。", "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
timer1.Enabled = true;
t2 = true;
t22 = true;
return;
}
else if (state == "continue")
{
//timer2开启,timer2关闭
islock = 1;
timer1.Enabled = false;
t22 = true;
t11 = false;
timer2.Enabled = true;
}
else
{
databind(ormid, ormnum, ormmoney, "充值失败", 0);
return;
}
//}
}
}
}
private string submittoweb(string ormid1,string ormnum1, string ormmoney1)
{
try
{
//页面元素读取,读取框架tabWin中的内容
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//用户号码
HtmlElement usernum = doc.All["custsimno"];
//重复输入
HtmlElement usernum1 = doc.All["custsimno1"];
//充值金额
HtmlElement usermoney = doc.All["pay"];
//代理商密码
HtmlElement userpwd = doc.All["agtpwd"];
//提交按钮
HtmlElement formbtn = doc.All["confirm"];
if (usernum == null || usermoney == null || formbtn == null || usernum1 == null || userpwd == null)
{
//如果页面读取出错
databind(ormid, ormnum, ormmoney, "连连充值失败提交冲正", 0);
return "continue";
}
//对页面内容进行赋值
usernum.SetAttribute("value", ormnum);
usernum1.SetAttribute("value", ormnum);
usermoney.SetAttribute("value", ormmoney);
userpwd.SetAttribute("value", str);
//执行提交按钮
formbtn.InvokeMember("click");
//执行js代码
doc.InvokeScript("SubmitbtnSave");
}
catch
{
}
return "continue";
}
private void timer2_Tick(object sender, EventArgs e)
{
//如果timer1正在运行
if (timer1.Enabled)
{
//timer2.Enabled = false;
return;
}
string innerText = "";
try
{
//获取页面集合
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
//读取页面form中的内容
innerText = doc.GetElementById("frmEdit").InnerText;
}
catch
{
throw;
}
//对读取出的内容进行截取
string[] strorder = innerText.Split(new string[] { "用户姓名", "充值金额", "代理钱包余额", "冻结钱包余额" }, StringSplitOptions.RemoveEmptyEntries);
if (strorder.Length <5)
{
return;
}
else
{
strorder[4].Replace(" ", "");
//如果剩余金额不为空
if (strorder[4].ToString() != "\r\n")
{
strorder[2].Replace("\r\n", "");
strorder[2].Replace(" ", "");
strorder[4].Replace(" ", "");
if (strorder[4].ToString() == "\r\n"||strorder[2].ToString()=="")
return;
if (allmoney !=strorder[4].ToString())
{
strorder[4].Replace("\r\n", "");
strorder[4].Replace(",", "");
strorder[4].Replace(",", "");
//记录下用户名和金额
allmoney = strorder[4].ToString();
username = strorder[2].ToString();
//交易计数
nums++;
//进行数据记录,显示在listview中
databind(ormid, ormnum, ormmoney, "充值成功", 1);
//timer2关闭
timer2.Enabled = false;
//timer2关闭
//islock = 0;
t22 = false;
t11 = true;
timer1.Enabled = true;
}
else
return;
}
else
return;
}
}
private void webPage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webPage.ReadyState < WebBrowserReadyState.Complete)
return;
////屏蔽js窗体
if (webPage.DocumentText.IndexOf("window.open(") > -1 || webPage.DocumentText.IndexOf("window.close()") > -1)
{
webPage.DocumentText = webPage.DocumentText.Replace("window.open(", "window.external.open(").Replace("window.close()", "window.external.close()");
}
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function confirm() {";
s += "return true;";
s += "}";
s += "function alert(str) {return '';}";
win.execScript(s, "javascript");
string s1 = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
win.execScript(s1, "javascript");
}
catch
{
throw;
}
count--;
//判断页面是否加载完成count=0
if (count == 0 && t2)
{
//开启timer进行数据库信息读取
if (t11)
{
if (timer1.Enabled && timer2.Enabled)
timer2.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = true;
}
}
//开启timer2进行页面信息读取
else if (t22)
{
if (timer1.Enabled && timer2.Enabled)
timer1.Enabled = false;
else if (timer1.Enabled == false && timer2.Enabled == false)
{
timer2.Enabled = true;
}
else
{
timer2.Enabled = true;
}
}
else
{
}
}
}
private void webPage_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//屏蔽js窗体
if (islock==1)
{
try
{
HtmlDocument doc = webPage.Document.Window.Frames["tabWin"].Document;
IHTMLWindow2 win = (IHTMLWindow2)doc.Window.DomWindow;
string s = "function alert() {return '';}";
win.execScript(s, "javascript");
}
catch
{
}
}
count++;
}
/// <summary>
/// 连连充值数据信息状态更新
/// </summary>
/// <param name="ormd"> 信息编号</param>
/// <param name="ormn">号码</param>
/// <param name="ormoney">金额</param>
/// <param name="state">状态</param>
/// <param name="n">状态标识,1成功,0失败</param>
private void databind(string ormd, string ormn, string ormoney, string state, int n)
{
int id = 0;
try
{
id = ifiobj.SetOrderMobileStatell(str1, Convert.ToInt32(ormd), n, "连连交费" + state);
}
catch
{
}
if (id == 1)
{
ListViewItem[] listViewItem = new ListViewItem[1];
listViewItem[0] = new ListViewItem(new string[] { ormd, ormn, ormoney + "元", state });
lvorder.Items.AddRange(listViewItem);
////开启timer1标识
//t11 = true;
//timer1.Enabled = true;
return;
}
else
{
t2 = false;
timer1.Enabled = false;
MessageBox.Show("编号为:" + ormid + "的交易" + state + "\r\n信息记录失败,程序已经终止,请记录该信息,单击确定继续程序", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
t2 = true;
timer1.Enabled = true;
}
}
private void ForthForm_Load(object sender, EventArgs e)
{
tsbtnstart.Enabled = false;
lvorder.Columns.Add("编号", 40);
lvorder.Columns.Add("号码", 80);
lvorder.Columns.Add("充值金额", 80);
lvorder.Columns.Add("状态", 120);
lvorder.GridLines = true; //显示表格线
lvorder.View = View.Details;//显示表格细节
lvorder.HeaderStyle = ColumnHeaderStyle.Clickable;//对表头进行设置
lvorder.FullRowSelect = true;//是否可以选择行
}
}
}
这不是一个新问题,网上讨论此问题的帖子不少,说什么的都有,今天做个总结。
当我们使用WebBrowser控件时弹出错误信息框,而且会让一些自动执行的程序暂停,如何禁用呢?
将WebBrowser控件ScriptErrorsSuppressed 设置为True,可禁止弹出脚本错误对话框,ScriptErrorsSuppressed属性是对其基础COM控件的Silent属性的封装,因此设置ScriptErrorsSuppressed属性和设置其基础COM控件的Slient属性是效果一样的,这一点通过反编译System.Windows.Forms程序集可以证实。
为了解决这个问题,有的人专门从WebBrowser派生出一个新类,然后重写了AttachInterfaces方法,其实也是没有必要的,效果和直接设置ScriptErrorsSuppressed属性相同。
不过要注意的是:
ScriptErrorsSuppressed 设置为True会禁用所有的对话框,比如提示Activex下载、执行以及安全登录等对话框。
如果不想禁止除脚本错误之外的对话框,请使用MSDN上的代码示例:
private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
((WebBrowser)sender).Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
}
private void Window_Error(object sender, HtmlElementErrorEventArgs e)
{
// Ignore the error and suppress the error dialog box.
e.Handled = true;
}
一、屏蔽alert、confirm、showModalDialog源代码:
例1、先引用COM组建mshtml;
引用名称空间mshtml:
using mshtml;
然后处理WebBrowser控件的Navigated事件,代码如下:
- private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
- {
- IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
- string s = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
- win.execScript(s, "javascript");
- }
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow; string s = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;"; win.execScript(s, "JavaScript"); }
例2、
我们在使用WebBrowser得到网页代码模拟操作的时候,常常会因为目标网页有弹出对话框(alert、confirm)而中断我们操作,网上也有关于屏蔽这些对话框的介绍,比如另开一线程来定时确定,或是采用FindWindow等方法来进行关闭对话框,但这些办法给人感觉总有点烦琐;其实我们只要在目标网页中重载alert和confirm函数,让它们一直都返回true,那就ok拉,下面我们来说说在.net2.0中如何实现:
该办法要用到IHTMLWindow2类,所以我们要先添加一个引用:在项目引用里面选择COM选项卡,添加Microsoft HTML Object Library,然后在我们的cs文件中引如名称空间:mshtml;
然后取得我们目标页面的HtmlDocument,比如:
HtmlDocument hd = webBrowser1.Document.Window.Frames[0].Document;
接着进行最重要的一步,重载alert,confirm函数:
IHTMLWindow2 win = (IHTMLWindow2)hd.Window.DomWindow;
string s = @"function confirm() {";
s += @"return true;";
s += @"}";
s += @"function alert() {}";
win.execScript(s, "javascript");
OK ,大功告成,我们可以继续我们正常的操作拉,比如填写表单并提交:
hd.All["username"].SetAttribute("value","username");
hd.All["password"].SetAttribute("value","password");
hd.All["buttom"].InvokeMember("click");
运行一下,烦人的alert和confirm总算不见了
二、关闭调试对话框:
处理webbrowser的NewWindow事件,设定其传入的参数Cancel=false即可。
|