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 則留言:

  1. 您好:

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

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

    請您指導, 謝謝.

    Sam14966 敬上

    回覆刪除
  2. 想要在好友接聽時,馬上自動播放一段音樂,必須透過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.

    你試試看吧 :)

    回覆刪除
  3. OK了,但 wav檔格式必須是16K,16bit,mono

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

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

    謝謝

    Sam14966 敬上

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

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


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

    謝謝

    Sam14966

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

    Sam14966

    回覆刪除
  7. 原來如此
    感謝您的分享 :)

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

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

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

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

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

    :)

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

    回覆刪除
  13. 作者已經移除這則留言。

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

    回覆刪除
  15. 作者已經移除這則留言。

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

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

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

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

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

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

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

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

    以上 :)

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

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

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

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

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

    回覆刪除