C#でSkypeAPIを使ってみた その3

chakemiです。本日も掛ける相手もいないのにSkypeAPIを弄ってみました。

前回までのアプリケーションで気になっていた部分があってSkype自体のWindowが前面に表示されてしまうという点。

Skype自体がそんなしゃしゃり出て来られたら、作ったアプリ意味ないじゃん。。。 なので、おじゃまなSkypeのWindowを最小化するボタンを付けてみました。

開発環境

  • Windows7
  • Visual C# 2010 Express

SkypeのWindowを隠すのにどうしたらいいのか調べたところ SkypeAPIコマンドというものを使うようです。

SkypeAPIコマンドとは、実行中のSkypeクライアントに発行するテキストベースのコマンドのことで、リファレンスには載ってなく(ちゃんと見てないだけですが)Tracer.exeという公式アプリケーションでトレース出来るようです。

コマンドを実行するには、SendCommand()メソッドの引数にコマンドを渡しますが直接、記述はできないようで、CommandClassを使います。

1

2

3

4

5

6

7

8

Command cd = new CommandClass();





private void button3_Click(object sender, EventArgs e)

{

    cd.Command = "MINIMIZE";

    axSkype1.SendCommand(cd);

}

Windowを最小化する「MINIMIZE」コマンドを実行して、邪魔なWindowを隠せるようになりました。

もう少しおしゃれに、ボタンではなく常に非表示にしたいとこですが、イベントが発生する度に 前面にしゃしゃり出て来て、めんどくさいのでとりあえずこのままで。。。

次にWindowを隠したので、コンタクトリストだとかも使えるようにしたいと思います。

FormにlistBoxを追加して、そこにコンタクトリストを表示できるようにしたいと思います。 コンタクトリストを取得するには、SkypeコンポーネントのFriendsプロパティからUserオブジェクトを取得します。

1

2

3

4

5

6

7

private void contactList()

{

    foreach (User user in axSkype1.Friends)

    {

        listBox1.Items.Add(user.Handle);

    }

}

フォームをロードするときに呼び出して、リストボックスに追加してみます。

1

2

3

4

5

6

7

8

9

private void Form1_Load(object sender, EventArgs e)

{

    if(axSkype1.Client.IsRunning == false)

    {

        axSkype1.Client.Start();

    }

    axSkype1.Attach(8, false);

    contactList();

}

これで、完成!! 友達が少ないんで、とてもさびしいコンタクトリストが表示されました。。。orz

次回があるかわかりませんが、次は少ないコンタクトリストから選んだ相手にCallしたいと思いますが、 果たして、選べるほどいるのかって問題が先のような気がしてます。泣

コード全体(適当に書いてたので名前空間をusingディレクティブで整理しました)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Collections;

using SKYPE4COMLib;



namespace SkypeTest

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }



        Call call = new Call();

        Command cd = new CommandClass();



        private void Form1_Load(object sender, EventArgs e)

        {

            if (axSkype1.Client.IsRunning == false)

            {

                axSkype1.Client.Start();

            }

            axSkype1.Attach(8, false);

            contactList();

        }



        private void button1_Click(object sender, EventArgs e)

        {

            call = axSkype1.PlaceCall("echo123");

        }



        private void button2_Click(object sender, EventArgs e)

        {

            call.Finish();

        }



        private void button3_Click(object sender, EventArgs e)

        {

            cd.Command = "MINIMIZE";

            axSkype1.SendCommand(cd);

        }



        private void contactList()

        {

            foreach (User oUser in axSkype1.Friends)

            {

                listBox1.Items.Add(oUser.Handle);

            }

        }



    }

}