用 C# 控制 Skype






4.59/5 (37投票s)
用于控制 Skype 的 C# 示例代码。

请先阅读 - Skype API 停用通知
微软计划于 2013 年 12 月停用 Skype 桌面 API。 解释是,
"桌面 API 创建于 2004 年,不支持移动应用程序开发。因此,我们决定在 2013 年 12 月停用桌面 API。"
然而,许多开发者在其产品中使用了 Skype API 来增强 Skype 的功能。许多 Skype 用户在其业务和日常生活中依赖这些产品。
有一项 请愿活动,要求 Skype 重新考虑这一决定。
引言
我用 C# 编写了一个控制 Skype VoIP 应用程序的示例代码。Skype Control API 文档是免费提供的。为什么不尝试用 C# 来实现呢?
可下载的 ZIP 包包含一个 Visual Studio 2005 解决方案,其中有两个项目 - Skype Control 类库和测试应用程序。
背景
Windows 版的 Control API 使用窗口消息在 Skype 和客户端应用程序之间进行通信。这涉及到 Windows API 函数的使用。.NET Framework 类不直接支持处理窗口消息。幸运的是,.NET 中有一个称为平台调用 (Platform Invoke) 的机制,它允许调用 DLL 中的非托管代码。
我在这里不详细解释 Control API,但我将提供足够的信息,让大家能够开始使用代码进行实验,并通过测试应用程序来操作 Skype。
通信启动
Skype 使用窗口消息与客户端应用程序通信。已注册的窗口消息用于启动通信。SkypeControlAPIDiscover
消息通过广播给所有窗口来查找 Skype 窗口句柄。发送此消息时必须指定客户端应用程序的窗口句柄。如果 Skype 正在运行,它将直接向我们的客户端窗口发送 SkypeControlAPIAttach
消息作为响应。
internal class Constants
{
public const string SkypeControlAPIDiscover = "SkypeControlAPIDiscover";
public const string SkypeControlAPIAttach = "SkypeControlAPIAttach";
}
SkypeControlAPIAttach
消息的 LPARAM
包含附加代码。在成功连接的情况下,它可以是 Success
。当客户端应用程序首次尝试连接时,Skype 会弹出一个授权对话框,并通过发送带有 PendingAuthorisation
代码的 SkypeControlAPIAttach
消息通知客户端。根据用户的操作,Skype 接下来会发送 Success
或 Refused
通知。
public enum SkypeAttachStatus : uint
{
Success = 0,
PendingAuthorizaion = 1,
Refused = 2,
NotAvailable = 3,
Available = 0x8001
}
当 Skype 应用程序启动时,它会广播带有 Available
代码的 SkypeControlAPIAttach
消息。
请注意,Skype 假定我们的客户端应用程序将在“一秒钟”内处理结果为 1 的消息,否则连接将超时并关闭通信。在调试客户端时,了解这一点非常重要。幸运的是,可以通过修改注册表将 Skype 设置为特殊的“开发模式”(请参阅 Skype API 文档)。
发送命令
WM_COPYDATA
窗口消息用于发送 Skype 命令以及接收命令回复和通知。
在 C# 中处理 WM_COPYDATA
消息有点棘手。CopyDataStruct
需要正确地封送(marshal)到非托管代码和从非托管代码解封送。最直接的解决方案是简单地这样传递 CopyDataStruct
[DllImport("user32.dll")]
public static extern IntPtr SendMessageTimeout(IntPtr windowHandle,
uint Msg,
IntPtr wParam,
ref CopyDataStruct lParam,
SendMessageTimeoutFlags flags,
uint timeout,
out IntPtr result
);
请注意,在填充 CopyDataStruct
时,Length
成员也包括终止字符 '0
'。
从 Message
类获取 CopyDataStruct
的代码也非常简单,该类有一个方便的 GetLParam
方法来实现这一点。
Platform.CopyDataStruct aCDS =
(Platform.CopyDataStruct)m.GetLParam(typeof(Platform.CopyDataStruct));
string aResponse = aCDS.Data;
SkypeControl 库
所有处理窗口消息级别通信的代码都可以在 SkypeClient
类(SkypeControl
库)中找到。平台特定的代码在 Platform.cs 中。以上所有内容都是 Skype 控制库的内部实现。
SkypeProxy
类旨在供客户端应用程序用来控制 Skype。目前,它仅包装了对 SkypeClient
类的调用,并且仅包含用于低级 Skype API 通信的方法。它打算扩展更多高层封装 Skype API 的方法,例如 GetUserStatus
、Ping
。
要控制 Skype,只需创建一个 SkypeProxy
类的实例。通过调用 Connect
来启动通信。成功连接由 SkypeAttach
事件触发,并将 AttachStatus
设置为 Success
来指示。
通过调用 Command
并传入适当格式的文本命令来向 Skype 发送命令。Skype 的结果和通知通过 SkypeResponse
事件接收。
有关 Skype Control API 和命令语法的更多信息,请参阅 Skype 开发者区域免费提供的 Skype 文档。
尽情享用!
历史
- 2006 年 2 月 15 日:初次发布。