c# webBrowser控制showModalDialog窗体,急急

ccj188 2009-11-26 12:42:35
向各位高手求教个辣手问题。

我用c#制作了一个小程序,类似一个浏览器(使用webBrowser空间)。
有winfrm窗体frm1,frm2 两个窗体,frm1为主窗体,两个窗体都使用webBrowser控件制作成浏览器。

现有网页 a.htm 和 b.htm

a页面中代码
function opendata()
{
var aa=window.showModalDialog(“b.htm”,null,'dialogWidth:400px;dialogHeight:100px;center:yes;status:no;dialogWidth:400px;dialogHeight:300px');
if (aa!=null)
{
document.all.txt_Send_Email.value=aa
}
}

...
<input type=sumbit value="ok" onclick="opendate()">
...

这样每次点击ok后都会弹出一个b页面ie窗口,而我想让这个b页面在我的frm2中打开,这样我就好操作b页面的内容,不然我无法控制b页面。
...全文
540 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
VegaCNC 2011-06-29
  • 打赏
  • 举报
回复
请问楼主,现在测试通过了吗,可否把代码共享一下。
diamondTears1987 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shrinerain 的回复:]
将你自己的类实例传递给document.parentWindow的IDispatchEx接口.

然后用javascript函数劫持将windows.showModalDialog指向你的自定义函数.
[/Quote]

请问如何用javasript函数劫持 windows.showModalDialog啊,高手,就相信你了
wartim 2009-11-26
  • 打赏
  • 举报
回复
String FileName = AppDomain.CurrentDomain.BaseDirectory + "b.htm";
File.WriteAllText(FileName, "1");

这2句是我测试的,删掉,没用
wartim 2009-11-26
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Permissions;

namespace WindowsApplication169
{
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisibleAttribute(true)]
public partial class Form1 : Form
{
String URL = "www.baidu.com";

public Form1()
{
InitializeComponent();

String FileName = AppDomain.CurrentDomain.BaseDirectory + "b.htm";
File.WriteAllText(FileName, "1");

WebBrowser WB = new WebBrowser();
WB.Parent = this;
WB.Dock = DockStyle.Fill;
WB.ObjectForScripting = this;
WB.DocumentText = "<script type='text/javascript'>function opendata()"
+ "{"
+ " var aa=window.external.OpenNewWindow('" + URL + "');"
+ " alert(aa);"
+ " txt_Send_Email.value=aa"
+ "}</script>"
+ "<input type='sumbit' value='ok' onclick='opendata()'>"
+ "<input id='txt_Send_Email' type='text'>";
}

public String OpenNewWindow(String NewUrl)
{
if (NewUrl == URL)
{
Form F = new Form();
WebBrowser WB = new WebBrowser();
WB.Parent = F;
WB.Navigate(NewUrl);
F.ShowDialog();
return "返回值:" + WB.DocumentText;
}

return String.Empty;
}
}
}
liaoyukun111 2009-11-26
  • 打赏
  • 举报
回复
不会,帮顶
netstray 2009-11-26
  • 打赏
  • 举报
回复
帮你顶一下
ccj188 2009-11-26
  • 打赏
  • 举报
回复
自己顶了
龟仙 2009-11-26
  • 打赏
  • 举报
回复
学习了!!!
ccj188 2009-11-26
  • 打赏
  • 举报
回复
4楼代码如何来测试我11楼的测试页面代码?我测试没有搞出来了
ccj188 2009-11-26
  • 打赏
  • 举报
回复
我吧a.htm 和 b.htm 两个页面的内容贴出来。
在winfrm窗体的webBrowser控件中浏览a.htm页面,点确定后会弹出b.htm,

只要让b.htm页能在新winfrm窗体的webBrowser打开就可以了(不是ie窗体哦)。
因为我要在webBrowser得到b页面的元素并控制它们。


a.htm page code =========================================================

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<SCRIPT>
function checkUser()
{

var qryType = fm.checkType.value;
var svcnum = "";
if(qryType==0)
{
svcnum = fm.svcnum.value;

// 服务号码有效性验证
if (svcnum.length == 0)
{
alert("服务号码不能为空!")
return false;
}
}
else
{
svcnum = fm.certNum.value;

// 证件号码有效性验证
if (svcnum.length == 0)
{
alert("证件号码不能为空!")
return false;
}
}

var sFeatures = "dialogWidth:300px;dialogHeight:300px;status:no;help:no";
var rtnval = showModalDialog("b.html","","dialogWidth:400px;dialogHeight:300px");
if (rtnval)
{
fm.action = "ChangeCustAction.do?method=startBusi";
return true;
}
else
return false;
}

function chgCheckType()
{
var checkType = fm.elements["checkType"].value;

if(checkType==0)
{
disSvcNum.style.display="";
disCertNum.style.display="none";

}
else
{
disSvcNum.style.display="none";
disCertNum.style.display="";
}
}
</SCRIPT>

<FORM name=fm onsubmit="return checkUser();" method=post>
<TABLE class=nav01 cellSpacing=0 cellPadding=4>
<TBODY>
<TR>
<TD> 您现在的位置:业务受理 >> 过户 <BR></TD></TR></TBODY></TABLE>
<TABLE class=content01 borderColor=#7fb0de cellSpacing=0 borderColorDark=#ffffff cellPadding=1 border=1>
<TBODY>
<TR>
<TD class=tabletitle01 colSpan=4>[用户验证] </TD></TR>
<TR>
<TD class=tdtitle01>验证类型 </TD>
<TD><SELECT id=checkType onchange=chgCheckType() name=checkType> <OPTION value=0 selected checked>服务号码验证</OPTION> <OPTION value=1>证件号码验证</OPTION>
</SELECT> </TD>
<TD colSpan=2> </TD></TR>
<TR id=disSvcNum name="disSvcNum">
<TD class=tdtitle01 width="20%">主体服务类型: </TD>
<TD width="30%"><SELECT name=mainsvctype><OPTION value=G>G:GSM</OPTION>
</SELECT> </TD>
<TD class=tdtitle01 width="20%">服务号码: </TD>
<TD width="30%"><INPUT maxLength=11 value=13625500061 name=svcnum> <FONT color=red>* </FONT></TD></TR>
<TR id=disCertNum style="DISPLAY: none" name="disCertNum">
<TD class=tdtitle01 width="20%">证件号码: </TD>
<TD><INPUT maxLength=25 name=certNum> <FONT color=red>* </FONT></TD>
<TD colSpan=2> </TD></TR></TBODY></TABLE><INPUT class=cssButton type=submit value=确定> </FORM>
</body>
</html>



b.htm page code ========================================================


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="">
密码:
<label>
<input type="text" name="textfield" />
</label>
<label>
<input type="submit" name="Submit" value="确定" />
</label>
</form>
</body>
</html>
ccj188 2009-11-26
  • 打赏
  • 举报
回复
9楼说的对
shrinerain 2009-11-26
  • 打赏
  • 举报
回复
新窗体事件对于showModalDialog和showModlessDialog是不管用的.
shrinerain 2009-11-26
  • 打赏
  • 举报
回复
将你自己的类实例传递给document.parentWindow的IDispatchEx接口.

然后用javascript函数劫持将windows.showModalDialog指向你的自定义函数.
hyfzz123 2009-11-26
  • 打赏
  • 举报
回复
webbrowser有个产生新窗体事件tempBrowser_NewWindow(object sender, CancelEventArgs e)
在这事件里可以捕获然后写代码,最后记得e.Cancel = true;
ccj188 2009-11-26
  • 打赏
  • 举报
回复
wartim 你好,我把代码全贴出来给你看下,这个就是a.htm页面,
showModalDialog("../../common/check/CheckAction.do?method=userOptrCheck&optcode=GBGE&svcnum="+svcnum+"&mainsvctype="+fm.mainsvctype.value+"&queryType="+qryType,"",sFeatures);
中的地址相当于b.htm,现在这个showModalDialog弹出的对话框我无法控制,这个弹出框式个输入密码的窗口,我现在就是想在在winform窗口的webBrowser控件中控制它,得到他里面的输入框名字,并赋值。

<SCRIPT>
function checkUser()
{

var qryType = fm.checkType.value;
var svcnum = "";
if(qryType==0)
{
svcnum = fm.svcnum.value;

// 服务号码有效性验证
if (svcnum.length == 0)
{
alert("服务号码不能为空!")
return false;
}
}
else
{
svcnum = fm.certNum.value;

// 证件号码有效性验证
if (svcnum.length == 0)
{
alert("证件号码不能为空!")
return false;
}
}

var sFeatures = "dialogWidth:300px;dialogHeight:300px;status:no;help:no";
var rtnval = showModalDialog("../../common/check/CheckAction.do?method=userOptrCheck&optcode=GBGE&svcnum="+svcnum+"&mainsvctype="+fm.mainsvctype.value+"&queryType="+qryType,"",sFeatures);
if (rtnval)
{
fm.action = "ChangeCustAction.do?method=startBusi";
return true;
}
else
return false;
}

function chgCheckType()
{
var checkType = fm.elements["checkType"].value;

if(checkType==0)
{
disSvcNum.style.display="";
disCertNum.style.display="none";

}
else
{
disSvcNum.style.display="none";
disCertNum.style.display="";
}
}
</SCRIPT>

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧