基于Skype API开发外壳程序入门

简介: SkypeShell是一个Skype的外壳增强插件。这个程序是独立的EXE程序,它连接Skype API成为Skype的监听者。
SkypeShell是一个Skype的外壳增强插件。这个程序是独立的EXE程序,它连接Skype API成为Skype的监听者。实现了三个功能,1:显示Skype的状态信息;2:当Skype用户离开时有消息自动回复的功能;3:设置可以滚动显示多个签名档。
SkypeShell是在VC6下开发的一个MFC程序,它通过Skype4COM组件连接Skype。虽然VC也能支持直接使用这类COM组件,但是要更灵活地使用它,最好通过VC Class 
Wizard生成一个"包裹"类(wrapper)。具体方法如下:
1.下载Skype4COM.dll,注册到Windows系统中。命令为regsvr32 Skype4COM.dll
2.在VC的资源视图中,打开对话框界面,在对话框中点击右键菜单“Insert ActvieX Control”,选择“Skype Class”加入到对话框中。
3.修改Skype控件的ID为ID_SKYPE,按Ctrl+W打开Class Wizard,选择“Member Variables”,双击ID_SKYPE, 此时弹出对话框提示是否自动生成Wrapper Classes。点击是,并关联这个控件到CSkype对象即可使用。
接下来,要跟Skype建立连接,就可以调用CSkype对象的Attach方法,它有两个参数:协议版本号与连接方式,我们使用的是Attach(6,FALSE),即协议版本号为6,施行的是异步的连接方式,即非阻塞的,程序可以继续往前执行不用等待连接成功后才继续往前执行。

 
图1 与Skype建立连接的过程各种事件的函数调用
     
如上图1所示,首先①,调用Attach 方法:m_ctrlSkype.Attach(6, FALSE),接下来整个过程是这样的,在Skype客户端弹出一个对话框提示是否允许本程序操作Skype, 这时候会激发一个事件AttachmentStatus,程序可以调用它的处理函数:OnAttachmentStatusSkype,我们可以取得它的Satus:    apiAttachPendingAuthorization = 1,表示本程序正等待客户的允许对它的使用,这时候我们可以针对这个回调函数进行编程,即如下代码所示:
//客户端程序与Skype连接情况的回调函数
void CSkypeShellDlg::OnAttachmentStatusSkype(long Status) 
{
  //获取父窗口的句柄从而改变标题
  CWnd * pOwnerWnd = GetParent();    
  switch(Status)
  {            
  /*
  apiAttachUnknown = -1,
  apiAttachSuccess = 0,
  apiAttachPendingAuthorization = 1,
  apiAttachRefused = 2,
  apiAttachNotAvailable = 3,
  apiAttachAvailable = 4
         */
    case 1:
         pOwnerWnd->SetWindowText("SkypeShell  与Skype正建立连接...");
         break;
case 2:
……
  }
}
当Skype用户允许本程序对其使用时,进入2.1,由于允许外部程序跟Skype建立连接,这时候必须检测当前的Skype用户状态,所以会激发UserStatus事件,调用其回调函数:OnUserStatusSkype,发现这时候的Status为cusOffline = 0,即用户为离线状态,虽然是离线,本程序跟Skype程序却已经成功建立了连接,这时候又激发了OnAttachmentStatusSkype回调函数,查看Stauts,可以知道apiAttachSuccess = 0,即成功建立了连接。
在本程序里,获得Skype程序的状态,主要是通过下面的回调函数:
与Skype成功连接后如果用户的状态有所改变将会激发UserStatus事件,从而调用此回调函数
void CSkypeShellDlg::OnUserStatusSkype(long Status) 
{
/*
enum {
cusUnknown = -1,
cusOffline = 0, //离线     
cusOnline = 1,  //在线
cusAway = 2,   //离开
cusNotAvailable = 3, //没空
cusDoNotDisturb = 4,  //请勿打扰       
cusInvisible = 5,             //隐身
cusLoggedOut = 6,         //退出
cusSkypeMe = 7             //使用SkypeMe
} TUserStatus;
  */
  CWnd* pOwnerWnd = GetParent();                   
  switch(Status) {
         //离线     
  case  0:
         {
                pOwnerWnd->SetWindowText("SkypeShell
已连接Skype("+m_ctrlSkype.GetVersion()+")"+m_ctrlSkype.GetCurrentUser().GetFullName()+" 离线");
                //更改与Skype的连接状态为已连接上
                theConfig.m_bIsConnectSuccess = TRUE;
                break;
         }
……
         }
以上是有关本程序在操作Skype之前如何跟它建立连接,及它的状态改变时如何调用
各种回调函数的一个过程。
在成功与Skype建立连接,及始终保持连接的前提下,外部程序可以操作Skype的各各信息,因为Skype4COM API,封装了Skype API,我们使用起来很方便,比如说,本外壳程序的滚动个性签名功能,就是简单的使用了Skype4COM API:
//滚动个性签名集合中的个性签名
           m_ctrlSkype.GetCurrentUserProfile().SetMoodText(theConfig.m_cMoods[m_nCurMoodIndex].m_strContent.c_str());       
m_ctrlSkype是封装成的类CSkype对象,用来表示模拟Skype的各种功能,如上面的,改变用户个性签名。查看Skype4COM API的说明文档,我们可以找到其它功能都是如何模拟及使用的。
除此之外,本外壳程序还用到了另外一个Skype4COM AP中其它类对象,如 CChat,它是来模拟一个聊天会话,在这里我们主要是用来实现当Skype用户处于离开状态是留言自动回复的功能。
//Skype的回调函数,当用户收到或者发送消息时都会激活MessageStatus事件调
//用这个函数
void CSkypeShellDlg::OnMessageStatusSkype(LPDISPATCH pMessage, long Status) 
{
/*
enum {
cusUnknown = -1,
cusOffline = 0,
cusOnline = 1,
cusAway = 2,
cusNotAvailable = 3,
cusDoNotDisturb = 4,
cusInvisible = 5,
cusLoggedOut = 6,
cusSkypeMe = 7
} TUserStatus;

  */
  //获取当前自己的Skype的状态
  long m_lStatus = m_ctrlSkype.GetCurrentUser().GetOnlineStatus();
  //如果用户启动了自动回复功能
  if (theConfig.m_bIsAutoAnswer)
  {
         //表示当前用户是处于离线状态
         if (m_lStatus == 2)
         {
                //2表示有消息到来了
                if(Status == 2)
                {
                       CChatMessage cChatMessage;
                       cChatMessage.AttachDispatch(pMessage);
                       CString strHandle =       cChatMessage.GetFromHandle();
                       CChat cChat = cChatMessage.GetChat();
                       CUserCollection cUserCollection = cChat.GetMembers();
                       int nMembers = cUserCollection.GetCount();

                       CUser cUser = m_ctrlSkype.GetUser(strHandle);
                       
                       //如果对方是处于离开状态什么都不做并且必须不是来自群组消息
                       if(cUser.GetOnlineStatus() != 2 && nMembers == 1)
                       {
                              CChat cChat = cChatMessage.GetChat();
                              //发送用户选择的留言
                              cChat.SendMessage(theConfig.m_strSelectedAnswer.c_str());
                              cChatMessage.DetachDispatch();
             }
                }
         }
  }
}
目录
相关文章
|
6天前
|
监控 API 开发工具
探索 Postman:API 开发的瑞士军刀
在现代软件开发中,API 起着关键作用,连接前后端应用及微服务架构。Postman 是一款流行的一站式 API 开发工具,支持 REST、GraphQL 和 SOAP 等协议,具备构建、测试、调试 API 的强大功能,包括请求构建器、环境变量管理、测试脚本编写、文档生成及 Mock 服务器创建等。本文详细介绍 Postman 的核心功能与进阶技巧,助你提高 API 开发效率。
|
5天前
|
前端开发 API 开发者
探索后端开发中的RESTful API设计原则
【9月更文挑战第21天】在数字化时代的浪潮中,后端开发扮演着至关重要的角色。本文将深入探讨RESTful API的设计原则,旨在为开发者提供一套清晰、高效的指导方针。我们将从资源的命名与表述开始,逐步引导您理解如何通过统一接口和状态码来构建可扩展且易于维护的API。文章不仅涵盖理论知识,还将通过实际代码示例,展示如何将这些原则应用于日常开发实践中。无论您是初学者还是经验丰富的开发者,这篇文章都将为您的后端开发之旅增添宝贵的知识财富。
|
6天前
|
JavaScript NoSQL 关系型数据库
深入浅出后端开发:从零搭建RESTful API
【9月更文挑战第20天】在数字时代的浪潮中,后端开发如同一座桥梁,连接用户界面与数据世界。本文将引领你踏上一段探索之旅,从零基础开始,一步步揭开后端开发的神秘面纱。我们将以构建一个RESTful API为例,深入理解后端逻辑的核心。通过简洁的代码示例和生动的比喻,本文旨在让初学者轻松入门,同时也为有一定基础的开发者提供新的视角和思考。准备好,让我们开始这段奇妙的旅程吧!
|
8天前
|
API 网络架构 开发者
探索后端开发:RESTful API设计的艺术
【9月更文挑战第18天】在数字化时代的浪潮中,后端开发如同搭建一座座坚固的桥梁,连接用户与数据的无限可能。本文将深入浅出地探讨RESTful API设计的精髓,从理论基础到实践应用,带领读者领略API设计的艺术。我们将以代码示例为灯塔,照亮理解之路,但
|
16天前
|
前端开发 API 数据处理
探索后端开发中的API设计哲学
【9月更文挑战第10天】在数字化时代的浪潮下,后端开发作为连接数据与前端界面的桥梁,其重要性不言而喻。本文将深入探讨如何通过精心设计的API来提升后端服务的可维护性、扩展性和用户体验。我们将从API设计的基本原则出发,逐步展开对RESTful API和GraphQL两种流行风格的比较分析,并结合具体场景讨论最佳实践。文章旨在为开发者提供一套实用的API设计指南,助力打造高效、稳定且易于协作的软件架构。
34 6
|
15天前
|
API 网络架构 微服务
探索 GraphQL:现代 API 开发的新范式
GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,避免了传统 RESTful API 中的数据冗余问题。它由 Facebook 开发并开源,现广泛应用于现代 Web 和移动应用。本文将介绍 GraphQL 的核心概念、优势及其在不同场景下的应用,并指导你如何构建和优化 GraphQL API。
|
9天前
|
存储 JavaScript NoSQL
深入浅出后端开发:构建你的第一个RESTful API
【9月更文挑战第17天】在数字时代的浪潮中,后端开发是支撑起整个互联网的骨架。本文将引导读者了解后端开发的基本概念,并通过一个实际的代码示例,展示如何从零开始构建一个简单的RESTful API。我们将一起探索API设计的哲学、选择合适的后端语言和框架,以及实现数据存储和接口测试的过程。无论你是编程新手,还是希望扩展你的技术栈,这篇文章都将为你提供一次全面而深入的后端开发之旅。
27 0
|
API C#
(c#)SKYPE API项目总结(一)
原文: (c#)SKYPE API项目总结(一) 这个项目的需求:SKYPE软件文字聊天同步翻译,并将翻译后的内容会发送给对方,将对方发给自己的话翻译成自己语种。
1230 0
|
1月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
114 1
|
4天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
27 6