Skype 状态更改器
当用户锁定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用户的视频通话。
- 向个人发送即时消息或建立群组多人聊天。
更新
- 添加了扩展的SkypeStatusChanger应用程序的源文件 - 2013年6月21日
- Skype桌面API支持结束。
参考文献
- http://dev.skype.com/accessories/skype4com
- https://codeproject.org.cn/Articles/37909/Make-your-Skype-Bot-in-NET
- https://codeproject.org.cn/Articles/18924/Skype-Smiley-Sender
- http://stackoverflow.com/questions/5662546/how-can-i-change-skype-user-status-from-online-to-away-using-skype4com
- https://codeproject.org.cn/Articles/36468/WPF-NotifyIcon
- https://codeproject.org.cn/Articles/84270/WPF-Single-Instance-Application
- https://support.skype.com/en/faq/FA214/what-is-the-desktop-api
- https://support.skype.com/en/faq/FA12349/skype-says-my-application-will-stop-working-with-skype-in-december-2013-why-is-that
- http://developer.skype.com/skype-uris