発着信。呼の取得

発呼するにはPlaceCall(user_handle)。新しい呼を返す。公衆回線網(PSTN)に発信する場合は番号を指定可能な模様だが未確認。保留されていない呼がある場合には新しい発信はできないことに注意。

    oSkype.PlaceCall(user.Handle)

カンマ区切りで複数指定すると会議通話を作成できる。UI上では最大9人まで指定できそうだけど、Helpファイルだと昔の制限のまま4件までとなっている。実装がParamArrayじゃなくてOptionalになっているっぽいので、PlaceCall(String())とやった場合には動かない。PlaceCallの上限については、友人をテストに巻き込むのも悪い気がして未確認。

発着信を行って呼のステータスが変化した場合はCallStatusイベントが発生する。
一般的な発信呼のステータスの遷移は、clsRouting, clsRinging, clsInProgress, clsFinished。大体一般的なCTIアプリケーションに準じる形になってると思う。HoldのステータスはclsRemoteHoldとclsLocalHold。clsOnHoldも定義されているけど、いつOnHoldになるのか不明。互換性のため残されているのかも。相手先がOfflineの場合clsFailed、着信拒否はclsRefused。ほかにボイスメール系はステータスが別に用意されている。
着信呼はclsRingingから始まる。CallStatusイベントで発信呼と着信呼を区別するにはCall.Typeを参照する。発着信、P2PとPSTNの掛け合わせで4種類のTypeが存在する。着信呼に対しては各メソッドの実行で応答、着信拒否、転送等が行える。

Private Sub skypeObject_CallStatus(ByVal pCall As SKYPE4COMLib.Call, ByVal Status As SKYPE4COMLib.TCallStatus) Handles skypeObject.CallStatus
    'Away時は着信を音声テストに転送するサンプル
    If pCall.Status = SKYPE4COMLib.TCallStatus.clsRinging And _
        pCall.Type = SKYPE4COMLib.TCallType.cltIncomingP2P Then

        dim handle as string = "echo123"
        If skypeObject.CurrentUser.OnlineStatus = _
            SKYPE4COMLib.TOnlineStatus.olsAway Then

            pCall.Transfer(handle)
        End If
    End If
End Sub

あまり重要ではないかもしれないが、呼が転送されたときに被転送側ではCallStatusイベントを確認出来なかった。

Skype.ActiveCallsから現在接続されている呼が取得できるようになる。

    Dim call as SKYPE4COMLib.Call
    dim handle as string, name as string 
    for each call in oSkype.ActiveCalls
        '現在アクティブな呼
        handle = call.PartnerHandle
        name = call.PartnerDisplayName
    next

呼の通話相手はcall.PartnerHandleからハンドルを取得できる。User Objectは呼から直接取れない(コンタクトリストにない相手とも通話できるから)。
会議通話の場合、会議通話が終わるまで使用した呼はDisposeしない作りになっているらしく、会議通話中にFinished、Refused、Failedになった呼はActiveCallsのCollectionからは削除されない。これはSkypeの実装に由来するのか、SKYPE4COMの実装がそうなっているからなのかは未確認。終了した呼の情報を使用できるようにSkype本体の実装がそうなっている可能性も否定できないが、基本的に終了した呼は再利用できないし、呼の履歴はskype.Callsが保持しているはず。
会議通話用にskype.Conferenceがあるのだが、テストした限り値が入ってなさそうに思える。Object自体は常に存在するらしくアクセスしてもエラーにはならないが、UIからの場合とコードからの場合と共に、会議通話を作成してもConference.IDは常に0に設定されていた。