31 1月 2008

Skype API 的另一種應用 - Skype4Com

  Skype4Com - 意思就是Skype for Com,是將Skype API包成一個Com的Object,讓任何支援Com/ActiveX元件的語言所使用(如:Visual Studio, Delphi, BCB, VB, PHP, ... ),但是只限於Windows平台上。

  之前的文章介紹過的Skype API,是透過Windows Message去存取Skype的行為。但是這樣子的處理下,有些行為變得比較不直觀,比如,我想得到所有的友人清單,在自己撰寫的一個Function中,下Command : 「Search Friends」,卻必須在另一個Function : WndProc()中才能得到Skype回應的Message,這樣子的寫法會讓程式變得很支離破碎。
  而使用Skype4Com就沒有這樣子的困擾了,當你Create出一個Skype的Com物件後,就可以直接存取它裡面的一些變數值。所以就程式的觀點而言,Skype4Com是比較優的!!!


以下的網址可參考:
  1. Skype官網上 Skype4Com的說明
  2. Skype4Com的元件說明
  3. Skype4Com的Example (包含VB, C++, C#, Delphi)
  4. Skype4Com 1.0.28.2 Release下載 (包含Skype4Com.dll, Skype4Com Windows說明檔)

延伸閱讀:

25 則留言:

匿名 提到...

您好:

感謝您提供的例子,很容易入門,
現在我碰到一個問題,我想撥給一個好友,在好友接聽時,馬上自動播放一段音樂給好友聽,請問這播放音樂部份該如何寫?

我在 Status==clsInProgress 時
用Mediaplay1撥放WAV,但是聲音是從喇叭傳出來,並沒有傳給對方聽.

請您指導, 謝謝.

Sam14966 敬上

Falldog 提到...

想要在好友接聽時,馬上自動播放一段音樂,必須透過Skype4Com中的ICall Object,改變它的Properties: InputDevice,預設是音效卡,你可以把它改成指向一個File(即你要播放的音樂檔),等播放完畢,再改回音效卡即可聽到麥克風的聲音了。
可以指定的類別包含以下幾種:
enum TCallIoDeviceType
callIoDeviceTypeUnknown indicates that device is unknown.
callIoDeviceTypeSoundcard indicates soundcard.
callIoDeviceTypePort indicates local port.
callIoDeviceTypeFile indicates local file.

你試試看吧 :)

匿名 提到...

OK了,但 wav檔格式必須是16K,16bit,mono

另外, 再請教一個問題:
PlaceCall給市話,我偵測不到對方的按鍵,
在 void __fastcall Form1::mSkypeCallDtmfReceived(TObject *Sender,ICall *pCall, BSTR code)

當對方按鍵時, 這個Event卻沒有作動, 是不是還要設定哪裡呢?

謝謝

Sam14966 敬上

Falldog 提到...

撥市話我是沒試過啦~聽你說才知道有這功能 XD
你在mSkype create時,有指定Event Handler給它嗎?
Ex:
mSkype->OnCallDtmfReceived = mSkypeCallDtmfReceived;//Event function

匿名 提到...

我用bcb6
當.dll加入後, 就有一個skype元件在Activex上面了,直接選用就跟 Button,Edit等一般元件一樣了,skype 內定Event就有了, 直接取用即可,無須再指定 mSkype->OnCallDtmfReceived = mSkypeCallDtmfReceived
就像 mSkypeCallStatus 一樣,也是使用skype元件時就可用了.


關於 DTMF :
對方按鍵時, 我電腦喇叭可以聽到對方按鍵值的頻率聲, 表示skype可以接收到dtmf信號, 但就不知道如何轉為按鍵值?

謝謝

Sam14966

匿名 提到...

https://developer.skype.com/jira/browse/SPA-300
這是skype網站,客戶反映的問題, 原來這是Skype的 Bug,盼以後能修正了.
謝謝您的回答.

Sam14966

Falldog 提到...

原來如此
感謝您的分享 :)

yowming 提到...

你好
請教一下,在PlaceCall("id1","id2","id3","id4")時
有沒有辦法知道id1、id2、id3、id4個別的CallStatus

Falldog 提到...

這個我不清楚耶 沒試過@@
手邊也沒有電腦可以測試...
你可能要自己測一下喔

寄情 提到...

最近因為個人興趣接觸各種即時通訊軟體的API
想要嘗試製作結合全部的一個應用程式或WEB服務
不過我找也找不到SKYPE API有關登入登出的方法
上網找資料說是因為安全性問題所以不開放
所以我想用SendKeys的方式去讓他自動輸入
不過她提供了mSkype.Client.Focus();的方法好像也跟一般的Focus()不同
不知道您有沒有試過SendKeys來輸入的方式?

Falldog 提到...

我是沒試過用SendKeys的方式登入,不過我猜應該是可行的啦。而Skype API應該是只有在使用者登入後才會有用,所以在使用者尚未登入的情況下,執行什麼API應該都沒用。

你可能要試著用FindWindow,然後將focus移到text edit身上,再執行SendKeys的動作,才會有用吧。

:)

寄情 提到...

您的網頁寫得很詳細
對我受用很大
我也在想說要不要去找她的PID找視窗
不知道有沒有一點提示或想法可以建議不才我呢?

寄情 提到...
作者已經移除這則留言。
Falldog 提到...

Dear 寄情:
你說的提示或想法 指的是找Window嗎?
我記得之前有試過用Skype Window的Class Name去找有成功過喔~

寄情 提到...
作者已經移除這則留言。
Falldog 提到...

Dear 寄情,
您的問題可能要靠自己囉,那些部分我就沒碰過了,所以不能給你什麼好的建議了,SendKeys這種Windows API應該查一下就知道怎麼用了,加油~

SkypePM.exe跟skypeName.exe,我自己是還沒看過這process啦XD,可能跟你安裝了什麼有關吧~這我也不清楚..

寄情 提到...

謝謝我明白了: )
我也突然發現我問的不是API的問題: P
所以我就先刪文了
不過您寫的API內容相當詳盡呢~!

匿名 提到...

您好:
謝謝您提供寶貴的說明和講解,同在撥號給好友,馬上自動播放一段音樂的問題,我使用了InputDevice[callIoDeviceTypeFile] = "D:\\signal.wav";這樣的指令,但好友依然沒辦法聽到音樂,想請問是不是要再加什麼指令

Falldog 提到...

你有先用Tracer.exe下command試過了嗎???
先試試看透過Tracer下command行不行,可以的話,再根據這個流程,想辦法寫進code裡。

匿名 提到...

您好:
感謝您的建議,但不知道是因為自己不會用Tracer下指令的關係,還是程式結果有問題,Tracer並沒有達到預期的模擬,以下是我使用VC寫的程式:當skype順利接通後,我寫了
while(pSkype->ActiveCalls->GetCount()==count)
{
pCall->InputDevice[callIoDeviceTypeFile] = "D:\\signal.wav";
}
用來將音樂播出,WAV也轉成上面討論過的格式,但對方依然聽不到音樂,想請問要如何修改程式嗎?謝謝您的指導

Falldog 提到...

通常Tracer試不通的話,程式執行也不會行的,因為他們最後執行的程序應該是一樣的喔(都是透過傳送Window Message/COM處理)

所以應該是先研究為何Tracer行不通,可以work後,再把它寫成code

以上 :)

匿名 提到...

你好:
謝謝你的這篇文章,對於我目前在寫的程式有很大的幫助,只是...我想詢問...將這個object放至VB中後,能夠隨時都保持線上嗎??隨時都處於可以接聽的情形??
另外你文章上附的連結,好像已經無法連至原本的網頁了
謝謝

Falldog 提到...

你是指Skype4Com的object嗎? 隨時保持線上指的是不會讓狀態變為"離開"嗎? 這可能要查一下document,我沒試過,至於隨時可以接聽的話,應該把Skype launch起來後,應該都在可以接聽的狀態吧。

由於Skype官網把API的網頁全拿掉了,只能下載API的zip檔來看,所以文章上有關API的link應該全都失效了...Orz

匿名 提到...

你好:
skype4Com是否可開發fax(傳真)程式,若是可以那將會很省錢的方案,一紙傳真大陸不到一分鐘僅要0.7圓台幣.是不是很迷人!

Falldog 提到...

Skype4Com應該做不到傳真的功能,如果要的話,或許plug-in可以試試