简体   繁体   English

Skype - 如何开始?

[英]Skype - How to get started?

I spend lot of time. 我花了很多时间。 And the whole Skype forum seems broken or dead or they don't have technical guys to handle those sectors. 整个Skype论坛似乎已经破裂或死亡,或者他们没有技术人员来处理这些领域。

Getting started code examples are not working or not available (completely abnormal). 入门代码示例不起作用或不起作用(完全异常)。 ex: http://forum.skype.com/index.php?showtopic=3557 例如: http//forum.skype.com/index.php?showtopic = 3557

Therefore, i request can someone kindly please show me a simple C# working code example how to just get started step by step. 因此,我请求有人可以请给我一个简单的C#工作代码示例如何一步一步地开始。

Thanks in advance. 提前致谢。

  1. Add a reference to the skype COM library 添加对skype COM库的引用
  2. Add the following class and start exploring skype. 添加以下类并开始探索skype。

code (include using SKYPE4COMLib; , it screws up stackoverflow syntax highlighting) 代码(包括使用SKYPE4COMLib;,搞砸了stackoverflow语法高亮显示)

namespace Example
{
    class SkypeExample
    {
        private SkypeClass _skype;

        public SkypeExample()
        {
            _skype = new SkypeClass();
            _skype.MessageStatus += OnMessage;
            _skype._ISkypeEvents_Event_AttachmentStatus += OnAttach;
            _skype.Attach(7, false);
        }

        private void OnAttach(TAttachmentStatus status)
        {
            // this app was successfully attached to skype
        }

        private void OnMessage(ChatMessage pmessage, TChatMessageStatus status)
        {
            // dont do anything if the message is not received (i.e. we are sending a emssage)
            if (status != TChatMessageStatus.cmsReceived)
                return;

            // simple echo service.
            _skype.get_Chat(pmessage.ChatName).SendMessage(pmessage.Body);
        }

        public bool MakeFriend(string handle)
        {
            for (int i = 1; i <= _skype.Friends.Count; i++)
            {
                if (_skype.Friends[i].Handle == handle)
                    return true;
            }

            UserCollection collection = _skype.SearchForUsers(handle);
            if (collection.Count >= 1)
                collection[1].BuddyStatus = TBuddyStatus.budPendingAuthorization;

            return false;
        }
    }
}

In addition to what jgauffin said, here's the (singleton) wrapper class that I used to use (C# 3): 除了jgauffin所说的,这里是我以前使用的(单例)包装类(C#3):

using System;
using System.Collections.Generic;
using System.Linq;
using SKYPE4COMLib;

namespace SkypeR
{
    public class SkypeApplication
    {
        private static readonly SkypeApplication TheInstance = new SkypeApplication();
        private readonly Skype _skype = new Skype();

        private SkypeApplication()
        {
            _skype.OnlineStatus += SkypeOnlineStatus;
            _skype.UserStatus += SkypeUserStatus;
            _skype.UserMood += SkypeUserMood;
        }

        private void SkypeUserMood(User puser, string moodtext)
        {
            FireUserMood(puser.GetUserInfo(), puser.OnlineStatus.GetStatusValue(), moodtext);
        }

        public string MyMood
        {
            get { return _skype.CurrentUserProfile.MoodText; }
            set { _skype.CurrentUserProfile.MoodText = value; }
        }

        public static SkypeApplication Instance
        {
            get { return TheInstance; }
        }

        public bool Running
        {
            get { return _skype.Client.IsRunning; }
        }

        public string Information
        {
            get { return String.Format("v{0}", _skype.Version); }
        }

        public Status MyStatus
        {
            get { return _skype.CurrentUserStatus.GetStatusValue(); }
            set { _skype.CurrentUserStatus = value.GetTUserStatusValue(); }
        }

        public IEnumerable<Contact> ContactList
        {
            get
            {
                UserCollection friends = _skype.Friends;
                return from User user in friends select new Contact
                                                            {
                                                                UserInfo = user.GetUserInfo(),
                                                                Status = user.OnlineStatus.GetStatusValue()
                                                            };
            }
        }

        private void SkypeUserStatus(TUserStatus status)
        {
            FireUserStatus(status.GetStatusValue());
        }

        private void FireUserStatus(Status status)
        {
            if (OnStatusChange != null)
            {
                OnStatusChange(this, new StatusChangedArgs {Status = status, Time = DateTime.Now});
            }
        }

        private void SkypeOnlineStatus(User puser, TOnlineStatus status)
        {
            FireUserStatus(puser.GetUserInfo(), status.GetStatusValue(), puser.MoodText);
        }

        public void Start()
        {
            if (!_skype.Client.IsRunning)
            {
                _skype.Client.Start(true, true);
            }
        }

        public void Shutdown()
        {
            if (_skype.Client.IsRunning)
            {
                _skype.Client.Shutdown();
            }
        }

        public event EventHandler<UserSomethingChangedArgs> OnUserStatusChange;
        public event EventHandler<StatusChangedArgs> OnStatusChange;
        public event EventHandler<UserSomethingChangedArgs> OnUserMoodChange;

        private void FireUserStatus(UserInfo user, Status newStatus, string userMood)
        {
            if (OnUserStatusChange != null)
            {
                OnUserStatusChange(this,
                                   new UserSomethingChangedArgs
                                       {
                                           Contact = new Contact {UserInfo = user, Status = newStatus, Mood = userMood},
                                           Time = DateTime.Now
                                       });
            }
        }

        public void FireUserMood(UserInfo user, Status userStatus, string newMood)
        {
            if (OnUserMoodChange != null)
            {
                OnUserMoodChange(this,
                    new UserSomethingChangedArgs
                        {
                            Contact = new Contact { UserInfo = user, Status= userStatus, Mood = newMood },
                            Time = DateTime.Now
                        });
            }
        }
    }

    public class StatusChangedArgs : EventArgs
    {
        public Status Status { get; set; }
        public DateTime Time { get; set; }
    }

    public class UserSomethingChangedArgs : EventArgs
    {
        public Contact Contact { get; set; }
        public DateTime Time { get; set; }
    }

    public enum Sex
    {
        Female,
        Male
    }

    public enum Status
    {
        Online,
        Away,
        Offline,
        Unknown,
        DoNotDisturb,
        NotAvailable,
        SkypeMe,
        SkypeOut
    }

    public struct UserInfo
    {
        public string Name { get; set; }
        public Sex Sex { get; set; }

        public static bool operator ==(UserInfo i1, UserInfo i2)
        {
            return (i1.Name.Equals(i2.Name) && i1.Sex.Equals(i2.Sex));
        }

        public static bool operator !=(UserInfo i1, UserInfo i2)
        {
            return (!i1.Sex.Equals(i2.Sex) || !i1.Name.Equals(i2.Name));
        }

        public bool Equals(UserInfo other)
        {
            return Equals(other.Name, Name) && Equals(other.Sex, Sex);
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            return obj.GetType() == typeof (UserInfo) && Equals((UserInfo) obj);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                return ((Name != null ? Name.GetHashCode() : 0)*397) ^ Sex.GetHashCode();
            }
        }
    }

    public class Contact
    {
        public UserInfo UserInfo { get; set; }
        public Status Status { get; set; }
        public string Mood { get; set; }
    }

    public static class Extensions
    {
        public static string GetSomeName(this User user)
        {
            if (!string.IsNullOrEmpty(user.FullName))
                return user.FullName;
            if (!string.IsNullOrEmpty(user.DisplayName))
                return user.DisplayName;
            if (!string.IsNullOrEmpty(user.Handle))
                return user.Handle;
            if (!string.IsNullOrEmpty(user.Aliases))
                return user.Aliases;
            return "unbekannt";
        }


        public static Sex GetUserInfoSexValue(this TUserSex sex)
        {
            return sex == TUserSex.usexMale ? Sex.Male : Sex.Female;
        }

        public static string ToLocalString(this Status status)
        {
            switch (status)
            {
                case Status.Online:
                    return "online";
                case Status.Away:
                    return "abwesend";
                case Status.Offline:
                    return "offline";
                case Status.Unknown:
                    return "unbekannt";
                case Status.DoNotDisturb:
                    return "nicht stören";
                case Status.NotAvailable:
                    return "nicht verfügbar";
                case Status.SkypeMe:
                    return "Skype Me!";
                case Status.SkypeOut:
                    return "Skype out";
                default:
                    return String.Empty;
            }
        }

        public static Status GetStatusValue(this TOnlineStatus status)
        {
            switch (status)
            {
                case TOnlineStatus.olsOnline:
                    return Status.Online;
                case TOnlineStatus.olsAway:
                    return Status.Away;
                case TOnlineStatus.olsOffline:
                    return Status.Offline;
                case TOnlineStatus.olsDoNotDisturb:
                    return Status.DoNotDisturb;
                case TOnlineStatus.olsNotAvailable:
                    return Status.NotAvailable;
                case TOnlineStatus.olsSkypeMe:
                    return Status.SkypeMe;
                case TOnlineStatus.olsSkypeOut:
                    return Status.SkypeOut;
            }
            return Status.Unknown;
        }

        public static TUserStatus GetTUserStatusValue(this Status status)
        {
            switch (status)
            {
                case Status.Online:
                    return TUserStatus.cusOnline;
                case Status.Away:
                    return TUserStatus.cusAway;
                case Status.Offline:
                    return TUserStatus.cusOffline;
                case Status.Unknown:
                    return TUserStatus.cusUnknown;
                case Status.DoNotDisturb:
                    return TUserStatus.cusDoNotDisturb;
                case Status.NotAvailable:
                    return TUserStatus.cusNotAvailable;
                case Status.SkypeMe:
                    return TUserStatus.cusSkypeMe;
            }
            return TUserStatus.cusUnknown;
        }

        public static Status GetStatusValue(this TUserStatus status)
        {
            switch (status)
            {
                case TUserStatus.cusOnline:
                    return Status.Online;
                case TUserStatus.cusAway:
                    return Status.Away;
                case TUserStatus.cusOffline:
                    return Status.Offline;
                case TUserStatus.cusDoNotDisturb:
                    return Status.DoNotDisturb;
                case TUserStatus.cusNotAvailable:
                    return Status.NotAvailable;
                case TUserStatus.cusSkypeMe:
                    return Status.SkypeMe;
            }
            return Status.Unknown;
        }

        public static int GetImageIndex(this Status status)
        {
            switch (status)
            {
                case Status.Online:
                    return 0;
                case Status.Away:
                    return 1;
                case Status.Offline:
                    return 4;
                case Status.Unknown:
                    return 4;
                case Status.DoNotDisturb:
                    return 2;
                case Status.NotAvailable:
                    return 1;
                case Status.SkypeMe:
                    return 0;
                case Status.SkypeOut:
                    return 3;
                default:
                    return 4;
            }
        }

        public static UserInfo GetUserInfo(this User user)
        {
            // TODO: Maybe take from some database!
            return new UserInfo {Name = user.GetSomeName(), Sex = user.Sex.GetUserInfoSexValue()};
        }
    }
}

If you wish, extend it and maybe even post it back here if you want to. 如果你愿意,可以延长它,如果你愿意的话甚至可以把它发回去。

Genaral usage: 一般用法:

Starting Skype 启动Skype

SkypeApplication.Instance.Start();

Registering for some events 注册某些活动

SkypeApplication.Instance.OnUserStatusChange += UserStatusChange;
SkypeApplication.Instance.OnUserMoodChange += UserMoodChange;
SkypeApplication.Instance.OnStatusChange += StatusChange;

where, for example: 在哪里,例如:

private void UserMoodChange(object sender, UserSomethingChangedArgs args)
{
  var listViewItem = new ListViewItem(new[]
    {
      args.Time.ToString(),
      args.Contact.UserInfo.Name,
      args.Contact.Status.ToLocalString(),
      args.Contact.Mood
    }, args.Contact.Status.GetImageIndex());

  listView1.Items.Add(listViewItem);
  listViewItem.EnsureVisible();

  NotifyStatus(args);
  RefreshContactList();

  LogIt(args);
}

As you can see there are some auxiliary extension methods to get image indices, status message texts (that need to be localized) and so on. 正如您所看到的,有一些辅助扩展方法可以获取图像索引,状态消息文本(需要本地化)等等。

Setting my status 设置我的状态

SkypeApplication.Instance.MyStatus = Status.Away;

In contrast to jgauffin, the wrapper I wrote does not modify anything, just read-only except for the status. 与jgauffin相反,我写的包装器不会修改任何东西,只是只读状态除了状态。

Finally, one small deployment issue: You must compile the executable to x86 for the SKYPE4COMLib to work correctly. 最后,一个小的部署问题:您必须将可执行文件编译为x86才能使SKYPE4COMLib正常工作。 IIRC this applies to all COM interop assemblies anyway. IIRC这适用于所有COM互操作程序集。

Feel free to ask, if you have questions. 如果您有疑问,请随时询问。

Since Microsoft bought Skype the Skype API is deprecated. 自微软收购Skype以来,Skype API已被弃用。 You can't use it on new group chats. 你不能在新的群聊中使用它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM