希望通过C# 让此IE窗口执行某脚本,如<script>alert();</script>
1,不写IE插件
2,不借助第三方浏览器,只针对IE
3,不使用Winform的WebBrowser控件.
知道的朋友给个思路
补充说明:
我使用下面这段代码试了,'aaaaaaaaa'会在页面中显示出来,但是后面那段js脚本却没有运行.很奇怪.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocument doc = Browser.Document as HTMLDocumentClass;
doc.body.innerHTML += "aaaaaaaaa<script type=\"text/javascript\">alert(11);</script>";
}
}
31 个解决方案
#1
mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS
用Microsoft.mshtml.dll可以再c#程序里操作IE。
win.execScript("changeRegImg()", "javascript");//调用JS
用Microsoft.mshtml.dll可以再c#程序里操作IE。
#2
+1
#3
感谢楼上的.再补充一下.实际操作的时候.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.
#4
你要确定你的doc2是什么对象,是不是IHTMLDocument2
还有就是看看你取得的doc2是不是ie的,其他浏览器的文档对象会报错,文档对象
#5
doc对象是{mshtml.HTMLDocumentClass}
#6
不是null
#7
应该是:mshtml.IHTMLDocument2 iHTMLDocument2 = GetIHTMLDocument2ByUrl(payUrl);
不是HTMLDocumentClass
#8
但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.
我操作自建的对象并不会影响浏览器窗口的行为啊.
#9
可是你跟我说你要alert()
#10
alert();只是一段javascript脚本的示例而已.
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";
#11
哥们,还有好点子吗?
#12
你自己不是用的WebBrowser组件? 还不用webbrowser
#13
回12楼
我没有用WebBrowser啊.
我没有用WebBrowser啊.
#14
哥们,你还是不了解mshtml这个dll~~~这个完全可以直接操控整个页面,包括任何标签,你为毛还要通过调用js的形式来改value啊
#15
我觉得你应该把你为什么想这么实现说出来 这样说不定人家能给你好的解决方案 我目测是想搞作弊类型的软件?
#16
哈哈,15楼兄弟比较有想象力!
我只是想写个帐户自动登录的软件.
如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?
我只是想写个帐户自动登录的软件.
如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?
#17
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
#18
你还是描述的不是那么清楚 如果是你自己软件里要帮用户自动登录账户 然后获取信息显示在软件里可以用我上面的方案
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719
#19
我的目标很简单,
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本
现在的问题是卡在2上面了.
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本
现在的问题是卡在2上面了.
#20
我要做什么,我自己很清楚的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.
#21
同意,这种用法。。
#22
哥们,那也得看看我的需求是什么吧?
我登录了网页后呢?总要让人来操作网页吧?
你通过httprequest登录了,我怎么把登录结果转移到IE上面去呀?
#23
那你用sesion做判断,在数据库中做限制,登陆之后在用户的state中设置一个值,这里需要注意,你要定时去把登陆状态更新下,,,,
#24
alert('11');
#25
#26
过来 学习下。。
#27
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
#28
支持啊
#29
#30
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
-------------
COM是有继承的,至于匿名么貌似没有
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
----------------
ShellWindows 继承了IShellWindows, DShellWindowsEvents_Event这两个接口.包含了公共枚举IEnumerable,和两个事件方法。主要返回回windows窗口数目
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
//遍历当前IE实例
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass这个继承了大约十二到十一个接口和一堆的方法。主要是用来增强HTMLDocument这个mS 接口。
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
//HTMLScriptElement ,ms接口 。下面三句是添加一个Element元素到BODY里面(DOM树)
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
#31
HTMLBodyClass body = doc2.body as HTMLBodyClass; 我运行 得到的是 null 啊
#1
mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS
用Microsoft.mshtml.dll可以再c#程序里操作IE。
win.execScript("changeRegImg()", "javascript");//调用JS
用Microsoft.mshtml.dll可以再c#程序里操作IE。
#2
mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;//拿到html对象
win.execScript("changeRegImg()", "javascript");//调用JS
用Microsoft.mshtml.dll可以再c#程序里操作IE。
+1
#3
感谢楼上的.再补充一下.实际操作的时候.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.
doc2.parentWindow
这句会报异常InvalidCastException
Specified cast is not valid.
#4
你要确定你的doc2是什么对象,是不是IHTMLDocument2
还有就是看看你取得的doc2是不是ie的,其他浏览器的文档对象会报错,文档对象
#5
doc对象是{mshtml.HTMLDocumentClass}
#6
不是null
#7
doc对象是{mshtml.HTMLDocumentClass}
应该是:mshtml.IHTMLDocument2 iHTMLDocument2 = GetIHTMLDocument2ByUrl(payUrl);
不是HTMLDocumentClass
#8
但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.
我操作自建的对象并不会影响浏览器窗口的行为啊.
#9
但我的主旨是要操作浏览器的.
我操作自建的对象并不会影响浏览器窗口的行为啊.
可是你跟我说你要alert()
#10
alert();只是一段javascript脚本的示例而已.
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";
实际运行的可能是document.getelementbyid('XXXX').value="XXXXXXXX";
#11
哥们,还有好点子吗?
#12
你自己不是用的WebBrowser组件? 还不用webbrowser
#13
回12楼
我没有用WebBrowser啊.
我没有用WebBrowser啊.
#14
哥们,你还是不了解mshtml这个dll~~~这个完全可以直接操控整个页面,包括任何标签,你为毛还要通过调用js的形式来改value啊
#15
我觉得你应该把你为什么想这么实现说出来 这样说不定人家能给你好的解决方案 我目测是想搞作弊类型的软件?
#16
哈哈,15楼兄弟比较有想象力!
我只是想写个帐户自动登录的软件.
如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?
我只是想写个帐户自动登录的软件.
如果用mshtml这个dll自带的功能确实可以实现我需要的功能,可是*度不高.
每个网站登录方式都是不同的.
有些是用户名+密码
有些还有其他内容.
所以我打算只让软件起到保存信息,输出信息的功能,具体的登录功能放到配置中去,由js完成.
这样可定制性不是很高吗?
#17
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
#18
你还是描述的不是那么清楚 如果是你自己软件里要帮用户自动登录账户 然后获取信息显示在软件里可以用我上面的方案
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719
如果你只是想帮用户打开浏览器,然后帮用户自动登录可以参考下下面这片文章
http://blog.csdn.net/zhangaijiang/article/details/6039719
#19
我的目标很简单,
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本
现在的问题是卡在2上面了.
1,让浏览器打开网址
2,让浏览器运行指定的javascript脚本
现在的问题是卡在2上面了.
#20
我要做什么,我自己很清楚的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.
其他的变相实现方式,我都用过的,也是可以实现的,但就现在这个目标来说,还是满足不了的.
#21
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
#22
同意,这种用法。。
既然是账户自动登录 那你为何要用这么复杂的用mshtml或webbrowser这些去实现呢?
你使用System.Net下的HttpWebRequest,HttpWebResponse这些去模拟登录比你用js脚本登录靠谱很多吧
哥们,那也得看看我的需求是什么吧?
我登录了网页后呢?总要让人来操作网页吧?
你通过httprequest登录了,我怎么把登录结果转移到IE上面去呀?
#23
那你用sesion做判断,在数据库中做限制,登陆之后在用户的state中设置一个值,这里需要注意,你要定时去把登陆状态更新下,,,,
#24
alert('11');
#25
#26
过来 学习下。。
#27
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
#28
支持啊
#29
#30
嘿嘿,我自己搞定了,不过COM这东西真烦人,接口之间没有继承关系,无法匿名转换,但是强转却也能转换,
谁能给我一下解释吗?
下面这段代码是可以成功运行的,也是完全满足要求的.
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
-------------
COM是有继承的,至于匿名么貌似没有
ShellWindows m_IEFoundBrowsers = new ShellWindowsClass();
----------------
ShellWindows 继承了IShellWindows, DShellWindowsEvents_Event这两个接口.包含了公共枚举IEnumerable,和两个事件方法。主要返回回windows窗口数目
foreach (InternetExplorer Browser in m_IEFoundBrowsers)
//遍历当前IE实例
{
if (Browser.Document is HTMLDocumentClass)
{
HTMLDocumentClass这个继承了大约十二到十一个接口和一堆的方法。主要是用来增强HTMLDocument这个mS 接口。
HTMLDocumentClass doc2 = Browser.Document as HTMLDocumentClass;
HTMLScriptElement script = (HTMLScriptElement)doc2.createElement("script");
//HTMLScriptElement ,ms接口 。下面三句是添加一个Element元素到BODY里面(DOM树)
script.text = "alert('a');";
HTMLBodyClass body = doc2.body as HTMLBodyClass;
body.appendChild((IHTMLDOMNode)script);
}
}
#31
HTMLBodyClass body = doc2.body as HTMLBodyClass; 我运行 得到的是 null 啊