基于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
构建高效可扩展的RESTful API:后端开发的实践指南
【4月更文挑战第26天】在现代Web开发中,构建一个高效、可扩展且易于维护的RESTful API是后端工程师必须面对的挑战。本文将深入探讨如何利用最佳实践和流行技术,设计出符合REST架构原则的服务端接口。我们将重点讨论API版本控制、资源路由、数据库优化、缓存策略以及安全性考虑等方面,旨在为开发者提供一套综合性解决方案,帮助其提升API的性能与可靠性。
|
2天前
|
JSON API 数据处理
【Swift开发专栏】Swift中的RESTful API集成实战
【4月更文挑战第30天】本文探讨了在Swift中集成RESTful API的方法,涉及RESTful API的基础概念,如HTTP方法和设计原则,以及Swift的网络请求技术,如`URLSession`、`Alamofire`和`SwiftyJSON`。此外,还强调了数据处理、错误管理和异步操作的重要性。通过合理利用这些工具和策略,开发者能实现高效、稳定的API集成,提升应用性能和用户体验。
|
2天前
|
缓存 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
【4月更文挑战第30天】Flutter允许开发者通过`CustomPaint`和`CustomPainter`进行自定义绘制,以实现丰富视觉效果。`CustomPaint` widget将`CustomPainter`应用到画布,而`CustomPainter`需实现`paint`和`shouldRepaint`方法。`paint`用于绘制图形,如示例中创建的`MyCirclePainter`绘制蓝色圆圈。Canvas API提供绘制形状、路径、文本和图片等功能。注意性能优化,避免不必要的重绘和利用缓存提升效率。自定义绘制让Flutter UI更具灵活性和个性化,但也需要图形学知识和性能意识。
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
|
2天前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。
|
3天前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
3天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
【4月更文挑战第29天】本文探讨了在Web开发中流行的前后端分离模式,重点介绍了RESTful API的设计与实现。REST是一种基于HTTP协议的架构风格,核心概念包括资源、表述和状态转换。RESTful API设计遵循无状态、统一接口等原则,使用GET、POST、PUT、DELETE等HTTP方法执行操作,并通过状态码和JSON/XML传输数据。在PHP中实现RESTful API,可通过定义路由、创建控制器、处理请求和响应,同时注意安全性措施,如使用HTTPS。文中还提供了一个用户管理API的实战示例,以帮助读者更好地理解和应用RESTful API。
|
9天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
12 0
|
9天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
9 0
|
18天前
|
缓存 负载均衡 NoSQL
构建高效可扩展的RESTful API:后端开发的最佳实践
【4月更文挑战第14天】在当今快速发展的网络应用时代,一个结构良好且高效的RESTful API是确保后端服务可靠性和性能的关键。本文深入探讨了设计和实现高效可扩展RESTful API的最佳实践,涵盖了API设计原则、数据库优化、缓存策略以及负载均衡等关键方面。文中不仅提供了具体的技术建议,还通过案例分析展示了如何应对实际开发中的挑战。
|
20天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。