65.9K
CodeProject 正在变化。 阅读更多。
Home

Skype 状态更改器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (12投票s)

2013年6月7日

CPOL

3分钟阅读

viewsIcon

53139

downloadIcon

1984

当用户锁定Windows时,更改Skype状态。

引言

本技巧描述了一个小程序,该程序在用户锁定Windows时将Skype状态更改为“离开”,并在用户解锁系统时将其恢复为先前的状态。

背景

我在工作中非常频繁地使用Skype。当我离开工作场所时,我通常会锁定PC,但Skype状态仍然是“在线”。所以同事仍然给我发消息,因为他们认为我在线。我们还有企业IM工具,可以根据Windows用户活动更改用户状态。我决定在Skype中实现类似的功能。

实现

Skype4COM 库

Skype4COM是一个ActiveX组件,它将Skype API表示为具有属性、命令、事件和通知的对象。由于.NET互操作性,它很容易与C#一起使用。您可以从http://dev.skype.com/accessories/skype4com下载COM库。该库也可以在Skype安装后的C:\Program Files\Common Files\Skype 目录中找到。如果您的操作系统是x64,请查看 Program Files (x86) 而不是 Program Files.  

  • 将对Skype4COM.dll的引用添加到项目中
  • 将项目的平台目标更改为x86
  • 如果Skype4COM.dll未注册为COM服务器(您的应用程序中会收到有关此的异常),请使用命令行注册它
  • regsvr32 <path> (replace <path> by location of Skype4COM.dll) 

SkypeHelper

让我们考虑一下负责状态更改的SkypeHelper类的一部分

using SKYPE4COMLib;
 
namespace SkypeStatusChangerLib.SkypeApi
{
    public class SkypeHelper
    {
        // other constants
        // ....
        public const int SkypeProtocol = 7;
 
        private readonly Skype _skype;
 
        public SkypeHelper()
        {
            _skype = new Skype();
 
            // attach using Skype Protocol 7 API
            _skype.Attach(SkypeProtocol, false);
        }
 
        public bool SetUserStatus(UserStatus status)
        {
            try
            {
                // set Skype user status
                _skype.ChangeUserStatus((TUserStatus) status);
            }
            catch (Exception)
            {
                return false;
            }
 
            return true;
        }  
// ... other code

因此,要更改Skype状态(例如,为免打扰),我们只需要编写三个语句: 

var skype = new Skype();
skype.Attach(7, false); 
skype.ChangeUserStatus(TUserStatus.cusDoNotDisturb);

Windows锁定和解锁事件

我们需要知道用户何时锁定和解锁Windows才能更改Skype状态。因此,我们将事件处理程序写入Microsoft.Win32.SystemEvents.SessionSwitch事件

private const string StatusChanged = "Status changed to: ";

private static SkypeHelper skyper = new SkypeHelper();
private static UserStatus lastUserStatus = UserStatus.Unknown;
// ...

SystemEvents.SessionSwitch += systemEventsSessionSwitch; 
// ...

private static void systemEventsSessionSwitch(object sender, SessionSwitchEventArgs e)
{
    switch (e.Reason)
    {
        case SessionSwitchReason.SessionLock:
            lastUserStatus = skyper.GetUserStatus();
            skyper.SetUserStatus(UserStatus.Away);

            Console.WriteLine(StatusChanged + UserStatus.Away);
            break;

        default:
            skyper.SetUserStatus(lastUserStatus);

            Console.WriteLine(StatusChanged + lastUserStatus);
            break;
    }
}

在这里,我们在锁定之前保存用户状态,将其更改为离开,然后在解锁后恢复状态。

访问Skype 

首次应用程序连接到Skype时,您需要允许来自Skype的连接

附注:必须在Skype正在运行时完成用户状态的所有操作。

源代码

  • SkypeStatusChanger.zip是涵盖当前文章的简单原型应用程序。 它包含两个项目:库(包含一些此处未描述的其他方法)和控制台应用程序。
  • SkypeStatusChanger_Extended.zip是具有UI和其他功能的更真实的应用程序。 但是,基本功能基于本文。 您可以自己更深入地挖掘。

兴趣点

  • 简单的Skype API用法
  • Windows系统事件处理

坏消息:Skype将停用桌面API

根据Skype官方消息,桌面API(Skype4COM是它的包装器)不再受支持,并将于2013年12月停止使用。
或者,Skype尝试提供跨平台API(桌面,Web,移动),并引入了Skype URI - 新一代API。 但是就目前而言,与旧的桌面API相比,Skype URI的功能非常差

  • 焦点切换到Skype客户端。
  • 启动与其他Skype用户,电话或移动电话的音频通话 - 包括一对一对话和多人会议。 
  • 启动与另一个Skype用户的视频通话
  • 向个人发送即时消息或建立群组多人聊天。 
我希望Skype团队正在努力扩展Skype URI,并尽快交付(也许)。 这样我和其他使用桌面API的开发人员将能够将其应用程序迁移到URI。  

更新

  • 添加了扩展的SkypeStatusChanger应用程序的源文件 - 2013年6月21日
  • Skype桌面API支持结束。 

参考文献

祝您开发愉快! 
© . All rights reserved.