『求助』在Webpage上调用Windows Messenger API

  最近在工作中遇到一个在WebPage上调用Windows Messenger API的需求,于是到MSDN上大搜一番,还是有所收获。相关链接如下:http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/nacwebteam09032001.mspx?pf=true
  其中包含了一段MSN Instant Messenger代码。首先要提出的一个大家容易混淆的概念:Windows Messenger 与 MSN Messenger 到底有什么区别和联系?

·MSN Messenger不是系统自带的,而Windows Messenger在非Windows 2003的Microsoft系统上都已经作为默认组件安装,这里我们要使用到的就是Windows Messenger API

·MSN Messenger只能用.Net Passport这个微软统一身份验证来登陆,也就意味着它只能在一台联入了互联网的电脑上登陆使用。而Windows Messenger则有三种登陆方式:a. Exchange身份验证 b. .Net Passport身份验证 c. SIP身份验证。其中c. SIP身份验证不太常用。而现在很多企业都已经建立了内部Exchange服务器,这样就经常会采用Windows Messenger的Exchange身份验证来进行登录后内部员工IM联系。而如果使用b. .Net Passport身份验证则功能上与MSN Messenger完全一样。

·Windows Messenger可以同时使用三种身份验证登陆,换句话说就是我可以同时登陆企业内网的Windows Messenger IM以及互联网上的MSN Messenger。其中的联系人列表是整合的。就有点像MyIM能整合MSN以及QQ、Yahoo IM等等IM软件一样。而MSN Messenger不行

·MSN Messenger的聊天记录可以保存,且通讯功能更加强大,如最新的7.5版本“传情动漫”以及“手写”功能已经完全超越了QQ等同类IM软件。而Windows Messenger聊天记录在关闭聊天窗口后消失不自动保存,只集成了一些最基本的通信方式。可以算作是简化版的MSN Messenger

  有了以上的信息,我们已经可以开始试验了。将MSDN上的那段MSN Instant Messenger代码复制到本地,保存成.html文件,用IE打开。嗯。一切正常。请看下图(由于本人在台企上班,公司要求使用繁体操作系统,请大家见谅):

图一


  然后,我们把这个文件复制到wwwroot发布目录下。再通过 http://172.18.77.60/  (我电脑的IP地址)前缀来访问。如下图所示:

图二


  大家可以看到。同样一段代码。直接访问与发布后访问执行结果不同。我本想将此功能制作成一个WebPart以便在SharePoint上的任意地点引用。但是现在的问题是,只有我直接双击该html文件才能正常显示“联系人名单”,而我无论使用http://127.0.0.1/ 或者 http://localhost/ 或者 http://我的电脑IP地址/ 三种方式访问,联系人列表都会发生错误。但是通过点击“undefined”链接是可以实现对话功能的,通过查看源代码得知,其是通过枚举id来实现的,所以这里仅仅是一个显示上的问题。

  下面让我们来看看完整的代码,完全使用JavaScript调用Windows Messenger API来实现。
  1 None.gif < HTML >
  2 None.gif < HEAD >
  3 None.gif    < TITLE > Embedding MSN Messenger Test </ TITLE >
  4 None.gif
  5 None.gif    < OBJECT  CLASSID ="clsid:F3A614DC-ABE0-11d2-A441-00C04F795683"  
  6 None.gif   CODEBASE ="#Version=2,0,0,83"
  7 None.gif      CODETYPE ="application/x-oleobject"  ID ="oMsgrObj"  WIDTH ="0"  
  8 None.gif      HEIGHT ="0"  OnUserStateChanged ="alert();" >
  9 None.gif    </ OBJECT >
 10 None.gif    < OBJECT  CLASSID ="clsid:FB7199AB-79BF-11d2-8D94-0000F875C541"  
 11 None.gif   CODETYPE ="application/x-oleobject"
 12 None.gif      ID ="oMsgrApp"  WIDTH ="0"  HEIGHT ="0" >
 13 None.gif    </ OBJECT >
 14 None.gif
 15 ExpandedBlockStart.gifContractedBlock.gif    < STYLE > dot.gif
 16InBlock.gif   BODY
 17ExpandedSubBlockStart.gifContractedSubBlock.gif   {dot.gif}{
 18InBlock.gif      FONT-FAMILY: Verdana, Arial, Helvetica;
 19InBlock.gif      FONT-SIZE: 8pt;
 20ExpandedSubBlockEnd.gif   }

 21InBlock.gif   INPUT
 22ExpandedSubBlockStart.gifContractedSubBlock.gif   {dot.gif}{
 23InBlock.gif      FONT-FAMILY: Verdana, Arial, Helvetica;
 24InBlock.gif      FONT-SIZE: 8pt;
 25ExpandedSubBlockEnd.gif   }

 26InBlock.gif   .clsHeading
 27ExpandedSubBlockStart.gifContractedSubBlock.gif   {dot.gif}{
 28InBlock.gif      FONT-WEIGHT: bolder;
 29InBlock.gif      FONT-SIZE: 10pt;
 30ExpandedSubBlockEnd.gif   }

 31InBlock.gif   .clsContact
 32ExpandedSubBlockStart.gifContractedSubBlock.gif   {dot.gif}{
 33InBlock.gif      PADDING: 2px;
 34InBlock.gif      CURSOR: hand;
 35ExpandedSubBlockEnd.gif   }

 36ExpandedBlockEnd.gif   
</ STYLE >
 37 None.gif </ HEAD >
 38 None.gif
 39 None.gif < BODY  onLoad ="body_onLoad();" >
 40 None.gif
 41 ExpandedBlockStart.gifContractedBlock.gif < SCRIPT  LANGUAGE ="JScript" > dot.gif
 42InBlock.gif
 43InBlock.gif// Here are the definitions for the Messenger enumerated values we use
 44InBlock.gif
 45InBlock.gifvar MSTATE_OFFLINE = 1;
 46InBlock.gifvar MSTATE_ONLINE = 2;
 47InBlock.gifvar MSTATE_BUSY = 10;
 48InBlock.gifvar MSTATE_BE_RIGHT_BACK = 14;
 49InBlock.gifvar MSTATE_IDLE = 18;
 50InBlock.gifvar MSTATE_AWAY = 34;
 51InBlock.gif
 52InBlock.giffunction body_onLoad()
 53ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 54InBlock.gif   // First, we need to make sure that the Messenger controls got instantiated correctly
 55InBlock.gif
 56InBlock.gif   if ("undefined" != typeof(oMsgrObj) && null != oMsgrObj.object && "undefined" 
 57InBlock.gif   != typeof(oMsgrApp) && null != oMsgrApp.object)
 58ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 59InBlock.gif      // If so, let's check to see if we're online and (if so) populate our contacts UI
 60InBlock.gif
 61InBlock.gif      if (oMsgrObj.LocalState == MSTATE_ONLINE)
 62ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 63InBlock.gif         populateContacts();
 64ExpandedSubBlockEnd.gif      }

 65InBlock.gif      else if (oMsgrObj.LocalState == MSTATE_OFFLINE)
 66ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 67InBlock.gif         btnLogon.disabled = false;
 68ExpandedSubBlockEnd.gif      }

 69ExpandedSubBlockEnd.gif   }

 70InBlock.gif   else
 71ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 72InBlock.gif      // Uh, oh - the controls didn't get instantiated correctly; 
 73InBlock.gif      // the user probably needs to install Messenger
 74InBlock.gif
 75InBlock.gif      alert("You need to install the latest version of MSN Messenger!\nGo to http://messenger.msn.com right now!");
 76ExpandedSubBlockEnd.gif   }

 77ExpandedSubBlockEnd.gif}

 78InBlock.gif
 79InBlock.giffunction populateContacts()
 80ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 81InBlock.gif   var oList = oMsgrObj.List(0);
 82InBlock.gif   var oContact;
 83InBlock.gif   var i;
 84InBlock.gif
 85InBlock.gif   // To populate our contact list, we're going to iterate throught the 
 86InBlock.gif   // default list collection, check the state of each contact,
 87InBlock.gif   // and add a DIV with the approppriate appearance to our UI
 88InBlock.gif
 89InBlock.gif   for (i = 0; i < oList.Count; i++)
 90ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
 91InBlock.gif      oContact = oList.Item(i);
 92InBlock.gif
 93InBlock.gif      oNewElement = document.createElement("DIV");
 94InBlock.gif      oNewElement.innerText = oContact.FriendlyName;
 95InBlock.gif
 96InBlock.gif      switch (oContact.State)
 97ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 98InBlock.gif      case MSTATE_ONLINE:
 99InBlock.gif         // Don't need to do anything
100InBlock.gif         break;
101InBlock.gif      case MSTATE_OFFLINE:
102InBlock.gif         oNewElement.innerText += " (Offline)";
103InBlock.gif         oNewElement.style.color = "graytext";
104InBlock.gif         break;
105InBlock.gif      case MSTATE_BUSY:
106InBlock.gif         oNewElement.innerText += " (Busy)";
107InBlock.gif         break;
108InBlock.gif      case MSTATE_BE_RIGHT_BACK:
109InBlock.gif         oNewElement.innerText += " (Be Right Back)";
110InBlock.gif         break;
111InBlock.gif      case MSTATE_IDLE:
112InBlock.gif         oNewElement.innerText += " (Idle)";
113InBlock.gif         break;
114InBlock.gif      case MSTATE_AWAY:
115InBlock.gif         oNewElement.innerText += " (Away)";
116InBlock.gif         break;
117InBlock.gif      default:
118InBlock.gif         oNewElement.innerText += "(Just plain not around!)";
119InBlock.gif         oNewElement.style.color = "graytext";
120InBlock.gif         break;
121ExpandedSubBlockEnd.gif      }

122InBlock.gif      oNewElement.className = "clsContact";
123InBlock.gif
124InBlock.gif      // To enable us to respond to the onclick event, 
125InBlock.gif      // we're programmatically setting the event
126InBlock.gif      // handler AND we're defining an expando property
127InBlock.gif      // on the contact DIV whose value is set to
128InBlock.gif      // the index of the contact in the default list (so we can find them later)
129InBlock.gif
130InBlock.gif      oNewElement.onclick = sendMessage;
131InBlock.gif      oNewElement.setAttribute("CONTACTID", i.toString());
132InBlock.gif
133InBlock.gif      divContacts.appendChild(oNewElement);
134ExpandedSubBlockEnd.gif   }

135ExpandedSubBlockEnd.gif}

136InBlock.giffunction doLogon()
137ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
138InBlock.gif   // To logon, we just ask Messenger to display its logon UI
139InBlock.gif
140InBlock.gif   if (oMsgrObj.LocalState == MSTATE_OFFLINE)
141ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
142InBlock.gif      btnLogon.disabled = true;
143InBlock.gif      oMsgrApp.LaunchLogonUI();
144ExpandedSubBlockEnd.gif   }

145ExpandedSubBlockEnd.gif}

146InBlock.gif
147InBlock.giffunction sendMessage()
148ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
149InBlock.gif   // To send a message, we likewise just ask Messenger to do the heavy
150InBlock.gif   // lifting (we just have to
151InBlock.gif   // pass it a contact from the default list)
152InBlock.gif
153InBlock.gif   var nContactID = parseInt(window.event.srcElement.getAttribute("CONTACTID"));
154InBlock.gif   if (!isNaN(nContactID))
155ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
156InBlock.gif      var oContact = oMsgrObj.List(0).Item(nContactID);
157InBlock.gif      oMsgrApp.LaunchIMUI(oContact);
158ExpandedSubBlockEnd.gif   }

159ExpandedSubBlockEnd.gif}

160ExpandedBlockEnd.gif
161None.gif
</ SCRIPT >
162 None.gif
163 ExpandedBlockStart.gifContractedBlock.gif < SCRIPT  LANGUAGE ="JScript"  EVENT ="onLocalStateChangeResult(hr)"  FOR ="oMsgrObj" > dot.gif
164InBlock.gif
165InBlock.gifif (hr == 0)
166ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
167InBlock.gif   if (oMsgrObj.LocalState == MSTATE_ONLINE)
168ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
169InBlock.gif      // Now we're online
170InBlock.gif
171InBlock.gif      window.setTimeout("populateContacts();"3000);
172ExpandedSubBlockEnd.gif   }

173InBlock.gif   else if (oMsgrObj.LocalState == MSTATE_OFFLINE)
174ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
175InBlock.gif      // Now we're offline
176InBlock.gif
177InBlock.gif      divContacts.innerHTML = "";
178InBlock.gif      btnLogon.disabled = false;
179ExpandedSubBlockEnd.gif   }

180ExpandedSubBlockEnd.gif}

181ExpandedBlockEnd.gif
182None.gif
</ SCRIPT >
183 None.gif
184 None.gif < DIV  CLASS ="clsHeading" > Contacts (click on a contact to send a message!) </ DIV >
185 None.gif < DIV  ID ="divContacts"  STYLE ="MARGIN-TOP: 8px; 
186 None.gif MARGIN-BOTTOM: 8px; BORDER: 1px solid steelblue" ></ DIV >
187 None.gif < INPUT  TYPE ="BUTTON"  ID ="btnLogon"  VALUE ="Logon"  onClick ="doLogon();"  DISABLED ="yes" >
188 None.gif
189 None.gif </ BODY >
190 None.gif </ HTML >

  作为代码本身是很简单的,不用过多解释,整个实现的原理就是:首先new了两个Windows Messenger实例,分别为oMsgrObj以及oMsgrApp。然后通过对好友列表oList = oMsgrObj.List(0);循环枚举,并利用DOM技术塞入新的Element来列出好友名称oNewElement.innerText = oContact.FriendlyName; 以及好友状态switch (oContact.State)。最后通过function sendMessage()函数来实现OnClick事件,调用对应的Windows Messenger实例弹出好友对话框。整段代码是清晰明了也很容易懂的。这里我们主要看看造成上面图二错误的代码段:

None.gif function populateContacts()
None.gif{
None.gif   var oList = oMsgrObj.List(0);
None.gif   var oContact;
None.gif   var i;
None.gif 
None.gif   for (i = 0; i 
<  oList .Count; i++)
None.gif   {
None.gif      oContact 
= oList.Item(i);
None.gif 
None.gif      
oNewElement  = document.createElement("DIV");
None.gif      
oNewElement.innerText  = oContact.FriendlyName;


  其中由oList变量得到oMsgrObj的实例后枚举oList的各个Item并存放到oContact变量中。种种现象表明oMsgrObj以及oMsgrApp两个实例已经创建成功,否则无法调用其内部方法如 oMsgrObj.List(0) 以及 oList.Count,但是现在出问题的方法是 oContact.FriendlyName。图二现象表明如果使用IP访问该网页则 oContact.FriendlyName 方法无法正常得到联系人名称,所以会显示为 undefined。而直接通过IE打开该页面则一切正常。

  有些朋友说是安全性的问题,我已经把几个地址都加入“信任的网站”了,问题依旧。请看下图:
 



  接着我换了一个思路去做这个功能,直接在VS.Net中新建一个工程,引入COM中的MessengerAPI类,然后加入以下测试代码都会报错,不知道为什么。
 1 None.gif using  System;
 2 None.gif using  System.Collections;
 3 None.gif using  System.ComponentModel;
 4 None.gif using  System.Data;
 5 None.gif using  System.Drawing;
 6 None.gif using  System.Web;
 7 None.gif using  System.Web.SessionState;
 8 None.gif using  System.Web.UI;
 9 None.gif using  System.Web.UI.WebControls;
10 None.gif using  System.Web.UI.HtmlControls;
11 None.gif using  MessengerAPI;
12 None.gif
13 None.gif namespace  WebMessenger
14 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
15ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
16InBlock.gif    /// WebForm1 的摘要说明。
17ExpandedSubBlockEnd.gif    /// </summary>

18InBlock.gif    public class WebForm1 : System.Web.UI.Page
19ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
20InBlock.gif        private void Page_Load(object sender, System.EventArgs e)
21ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
22InBlock.gif            // 在此处放置用户代码以初始化页面
23InBlock.gif            getMsgrObj();
24ExpandedSubBlockEnd.gif        }

25InBlock.gif
26ContractedSubBlock.gifExpandedSubBlockStart.gif        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
27InBlock.gif        override protected void OnInit(EventArgs e)
28ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
29InBlock.gif            //
30InBlock.gif            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
31InBlock.gif            //
32InBlock.gif            InitializeComponent();
33InBlock.gif            base.OnInit(e);
34ExpandedSubBlockEnd.gif        }

35InBlock.gif        
36ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
37InBlock.gif        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
38InBlock.gif        /// 此方法的内容。
39ExpandedSubBlockEnd.gif        /// </summary>

40InBlock.gif        private void InitializeComponent()
41ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{    
42InBlock.gif            this.Load += new System.EventHandler(this.Page_Load);
43InBlock.gif
44ExpandedSubBlockEnd.gif        }

45ExpandedSubBlockEnd.gif        #endregion

46InBlock.gif
47InBlock.gif        private void getMsgrObj()
48ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
49InBlock.gif            MessengerAPI.MessengerClass oMsgr = new MessengerAPI.MessengerClass();
50InBlock.gif            Response.Write(oMsgr.MyStatus.ToString());
51ExpandedSubBlockEnd.gif        }

52ExpandedSubBlockEnd.gif    }

53ExpandedBlockEnd.gif}


  我百思不得其解,同样的方法难道只能在本地使用?那这段代码不就没有意义了吗?恳请各位大虾指点迷津。m(_  _)m 拜..

附Windows Messenger下载地址:
http://nj.onlinedown.net/soft/3366.htm

转载于:https://www.cnblogs.com/viva/archive/2005/09/26/244110.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Web Speech API可以在WebView中使用。WebView是一个嵌入在原生应用程序中的浏览器视图,允许原生应用程序显示Web内容。因此,您可以在WebView中加载包含使用Web Speech API的网页,并实现文字转语音功能。 要在WebView中使用Web Speech API,需要确保WebView的设置允许JavaScript执行,并且已经启用了Web Speech API。以下是一个简单的示例: ```java import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webview); // 启用JavaScript执行 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 加载包含Web Speech API的网页 webView.loadUrl("https://example.com/your-webpage-with-speech-api.html"); } } ``` 请注意,要确保在加载网页时使用的URL包含了使用Web Speech API的相关代码。 此外,在Android平台上,还需要在AndroidManifest.xml文件中添加适当的权限声明,以允许应用程序使用互联网: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <uses-permission android:name="android.permission.INTERNET" /> <application> ... </application> </manifest> ``` 通过上述设置,您可以在WebView中使用Web Speech API,并在Android应用程序中实现文字转语音功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值