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

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

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

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

開発環境

  • Windows7
  • Visual C# 2010 Express

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

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

コマンドを実行するには、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);
            }
        }

    }
}