返回首页

{A}
{S0} 简介
我们都看到了微软MSN Messenger活动SDK(好,我有;-)不错的小功能。 MSN提供的SDK,messengeractivitySDK.zip。与此SDK,开发人员创建小应用程序的权力。数据可以很容易地从一个应用程序发送到其他。我看到了一个。然而,这篇文章不是关于实施使者活动SDK。相反,它讨论。NET 2.0框架中的System.Windows.Forms.WebBrowser类的优势,所以你可以创建自己的类似的SDK。背景
现在该怎么做的MSN活动SDK开发使人们有可能为他人创造很好的扩展,如好玩的"井字脚趾"的游戏,他们作为一个例子给的?他们让开发商有一个VBScript和JavaScript之间的选择。其实,他们不给你选择明确的Internet Explorer给你的脚本语言的选择。我个人更喜欢作为一种脚本语言中的JavaScript,所以我会在JavaScript显示这个小的例子。
JavaScript有一个特殊的命名空间称为window.external。这个命名空间扩展的其他应用程序或表达的方式,我永远不会明白,"window.external是一个内置在DOM对象提供用于主机访问。" MSN Messenger使用这个扩展的空间,其他开发人员提供一种手段,使漂亮的Web应用程序可以与宿主应用程序。这一点,结合WebBrowser类被加载的页面能够调用任何方法,可以给你一个强大的方式,让开发人员没有任何危险的安全威胁的扩展。您的应用程序不会受到影响,在这种方式,因为那里的世界已经没有办法进入。与此同时,你所有的力量,使更多或更少的方法和属性提供。使用代码
在演示中,我曾试图保持代码尽可能的干净。我希望你能理解一切。足够的谈论现在,虽然。让我们告诉你一些黄金。 ;-)
首先,你需要与WebBrowser的形式就可以了,当然,以查看网页。我认为你可以处理WebBrowser和基本的HTML页面的形式创造。所以,我们想要做什么? 我们希望从网页中调用一个方法。我们希望从托管应用程序调用一个方法。我们希望得到一个字符串从托管应用程序。我们要设置一个字符串在宿主应用程序从网页。
让我们开始在宿主应用程序从网页调用的方法:

private void myCallAMethodButton_Click(object sender, EventArgs e) 

{ 

    // You can call any method from the page you loaded... 

    // I have enclosed this call in a try-catch, because it will 



    // create a exception when there isn't a page loaded ... 

    try 

    { 

        // If you call a method, you can use a object array to 

        // supply parameters. My method only has 1 parameter, 

        // so I give 1 object in the array. 

        myWebBrowser.Document.InvokeScript("InvokeMethod",

            new object[] { "Wow, impressive !" }); 

    }

    catch (Exception e) 

    { 

        MessageBox.Show(e.Message);

    }

}

顺便说一下,你应该检查文件属性。它包含了许多有价值的方法和其他好东西。让我们继续,而我们有精神!首先,让我们的呼吁是在应用程序的方法,而不是在HTML页面中。要调用一个方法是在宿主应用程序,你需要公开的COM类。不要问我为什么,它就是这么。{C}
在这个类中的任何方法或财产将被暴露在脚本通过window.external对象。要查看类的成员,你应该下载源代码。查看这个类不是很多,没有你尚未了解。现在,让我们应用我们刚刚创建的类,WindowExternal,在表单中的WebBrowser对象:
public MainForm()

{ 

    InitializeComponent();

  

    // This is it, THE MOST IMPORTANT THING IN YOUR APPLICATION ! :-)

    myWebBrowser.ObjectForScripting = new WindowExternal(); 

}

,您可以指定任何对象ObjectForScripting属性,即使你工作的形式,只要对象是ComVisible!兴趣点
人根本不知道电源的JavaScript。简单地学习语言,你就可以做任何事情,你想在C#或Delphi。现在这是我的小文章结束,我希望你喜欢阅读。历史2006年9月24日, - 这是我的文章和我第一次在CodeProject上的第一个版本,所以还没有一个真正的历史。但你可以肯定会有后续!12月10日,2006年 - 第二十更新。6月22日,2007年 - 文章编辑和移动到主要CodeProject.com文章基地。

回答

评论会员:triplebit 时间:2011/12/07
假设我自己的一个网站,并可以创建,我想任何网页,
我可以调用我的DOTNET应用程序以类似的方式从这个网页,这是一个方法不是我的DOTNET应用程序托管
关于
基顺
评论会员:?dfg1478 时间:2011/12/07
help.It"非常感谢给我一个解决方案。

评论会员:miauwmiauwmiauw 时间:2011/12/07
喜菲利普 是否可以运行在Mac OS的代码?我读您的消息之一,Win64上Vista和Mac OS X 10.5的"开关"。 我只想确认。 感谢
评论会员:菲利普范德Meeren 时间:2011/12/07
其实我不知道... ...

Mono项目是一个笑话,所以我没有试图安装它。

但是,对于Mac OS X Cocoa框架能够做到这一切,更。的框架内,你访问的每一个脚本语言,与Unix系统。用户将能够扩展你的应用程序,如果你有一个免费一天与AppleScript,Perl,Python和甚至C。

不要你也爱的代码
评论会员:?sduhd 时间:2011/12/07
如果文件不是我写的,我只是下载与WebBrowser控件
。像这样:
&# 160;的HTMLDocument maindoc = webBrowser1.Document;
&# 160; 尝试
&# 160;{
maindoc.InvokeScript("InvokeMethod")
}
我怎样才能获得像"InvokeMethod"的具体名称?
maindoc.DomDocument。
感谢。
评论会员:菲利普范德Meeren 时间:2011/12/07
我会很乐意回答您的问题,但我曾在Win64上Vista和Mac OS X 10.5的开关。如果我给你的任何代码,现在,它一定会是一个大的垃圾一堆。因为我"窗口"近1,5年。

对不起

你不也爱代码
评论会员:?Ashaman 时间:2011/12/07
当然,你证明可以很容易地扩展到解决其他两个目标,但你的文章应该表现出的全部4个样本

我给它一个4"非常酷,但需要制定。"

评论会员:菲利普范德Meeren 时间:2011/12/07
4件事情,我想解释以下几点:
我们希望从网页中调用一个方法。
我们希望从托管应用程序调用一个方法。
我们希望得到一个字符串从托管应用程序。
我们要设置一个字符串在宿主应用程序从网页。

我认为我这样做。难道是我错了吗?或者是你想告诉我别的东西吗? (英语不是我的母语{S2})

你不也爱代码
评论会员:?merlin981 时间:2011/12/07
我觉得这解释了微软的应用程序,如Microsoft Money中,有些是基于浏览器的。本文,我认为在以不同的方式赢应用程序。感谢。



〜〜〜




〜〜〜
评论会员:菲利普范德Meeren 时间:2011/12/07
没问题{S3}
我已经使用这种技术在我的许多项目... ...它确实使事情很多,更容易(在大多数情况下)。

我通常创建一个无形的WebBrowser,像XMLWriter的东西创建一个HTML(XHTML)页面,在HTML页的链接脚本,并调用基方法来调用新的脚本。这种方式,人们可以扩展的应用程序,而不需要一个"真正"的编程语言或编译器... "真正的"我的意思是可以编译的语言。动态语言没有不敬{S4}

不要你还爱代码
评论会员:?Airbornes 时间:2011/12/07
嗨,

谢谢你写这篇文章。我有一些问题,关于这项技术的限制。
认购脚本函数外部类的委托,可以在网页接收的事件是否有可能吗?
我们能否从外部类返回一个托管对象,这将看起来像这样:

 0;[System.Runtime.InteropServices.ComVisible(真)]
&# 160;公共类WindowExternal
{

&# 160; 公共类AnotherObject
  ;{
公共int值;

公共无效ShowValue()
{
  ; MessageBox.Show(Value.ToString ());{ BR}& #160; }
  ;}

AnotherObject GetSomeObject()
{
&# 160; AnotherObject OBJ =新AnotherObject()
 60; obj.Value = 5;


返回obj的; }
}

从这样的网页,并调用它:

函数managedObject(){
 60; OBJ = window.external.GetSomeObject()
& #160; obj.ShowValue()
}
评论会员:菲利普范德Meeren 时间:2011/12/07
第一个问题:
--------------------------{ BR}我没有能够做到,但{S4}的
第二个问题:
--------------------------{ BR}你可以使用新创建的类,但不能创建它的一个实例(不使用了后门,像代表invoke方法,或使用某种反射)。

我很抱歉:
--------------------------{ BR}遗憾的是,花了这么长的时间来回答你的问题... ...由于考试和预留把您的邮件后处理我的忘了这个问题。


不要你也爱的代码
评论会员:游客 时间:2011/12/07
?亚洲时报Siddharth巴曼
了大量的文章,它正是我一直在寻找中六}

- "的力量与你同在"
亚洲时报Siddharth
评论会员:。菲利普范德Meeren 时间:2011/12/07
谢谢你! : - >

你不也爱代码
评论会员:?菲利普范德Meeren 时间:2011/12/07
从您的"公共课WindowExternal"你会怎么调用的形式内部的功能,承载WebBrowser控件
里面?
谢谢!

比尔塞尔吉奥
评论会员:菲利普范德Meeren 时间:2011/12/07
我想我明白你的问题,我希望... ...


从延伸类的HTML页面调用函数是不是一个好的做法,但如果你真的想这样做... ...
只要给构造函数的参数的extentionclass ...

像这样的例子:
myWebBrowser.ObjectForScripting =新WindowExternal(myWebBrowser);

...

公共类WindowExternal
{
私人的WebBrowser WB = NULL;
公共WindowExternal(web浏览器WB){this.wb = WB;}
}
现在你可以从你的extentionclass内调用任何方法...
但如果你只是想从您的网页中调用的功能,将更好地声明一个委托,委托给作为参数... 遗憾的是,花了这么长时间,anwser这个问题... ...我没有互联网为5天... ...它几乎杀死了我




你不也爱代码
评论会员:?Darchangel 时间:2011/12/07
"我以前没有在分数和意见以及"

不担心菲利普,只是因为它没有移动尚未编辑的读者捐款。好了,你得到了我的5!保持良好的工作。

所有的概括是错误的,包括这一个!
(\ /)
(O.o)
(><){ BR}
评论会员:菲利普范德Meeren 时间:2011/12/07
TY,...

你不也爱的代码
评论会员:?昆汀Pouplard 时间:2011/12/07
很好的工作。前一阵子,我发现写一个应用程序时,已经有几个不错的免费所见即所得文本编辑器在那里为WinForms,但也有对DHTML万吨。结果是我做的东西很喜欢你描述什么。