03 10月 2007

Skype API simple example

原本的Skype API附有一個很基本的windows example,只要看這個範例應該就能了解Skype API的運作方式了,不過它多了不少沒必要的code,如果想了解大致上的架構與訊息傳遞的話,其實也不用太多的code,因此我在這邊重新改寫了一個有最最最基本功能簡單視窗程式。

http://falldog7.googlepages.com/Skype_simple_example_window.cpp

這隻程式,用純Win32 API寫的,只是單純的可以開始控制Skype,然後出現視窗,在視窗內點左鍵,就會送出"PING"這個指令給Skype,正常來說,Skype會回傳"PONG"的訊息回來,這樣的結果就是正確的!!!

Skype API基本流程(請對照著我寫好的範例程式):

1. 首先必須先透過RegisterWindowMessage定義一個Message ID,並存起來

UINT uiGlobal_MsgID_SkypeControlAPIAttach = RegisterWindowMessage("SkypeControlAPIAttach");
UINT uiGlobal_MsgID_SkypeControlAPIDiscover = RegisterWindowMessage("SkypeControlAPIDiscover");

2. 透過SendMessage() 將uiGlobal_MsgID_SkypeControlAPIDiscover廣播出去

SendMessage( HWND_BROADCAST, uiGlobal_MsgID_SkypeControlAPIDiscover, (WPARAM)hwnd, 0);

3. 接著就可以在WndProc()裡接收uiGlobal_MsgID_SkypeControlAPIAttach的訊息,若是LPARAM的值為程式開頭enum中定義的SKYPECONTROLAPI_ATTACH_SUCCESS,則表示有偵測到Skype。此時要將WPARAM記錄起來,因為它就是Skype Window Handle

hGlobal_SkypeAPIWindowHandle = (HWND)wParam;

4. 接著Skype就會不斷地送WM_COPYDATA的訊息過來,當我們收到後可以將訊息中的結果Show到視窗上。另外,很重要的是…在收到WM_COPYDATA後,務必要return 1;否則Skype會主動Disconnect!!!

5. 要控制Skype的話,就可以透過SendMessage() 將WM_COPYDATA的訊息,送給hGlobal_SkypeAPIWindowHandle,要傳輸的指令寫入COPYDATASTRUCT中即可。

執行結果頁面:

1.首先執行程式後,會出現一個Skype的詢問視窗,問使用者是否要開放這個試圖操控Skype的程式,當然要選Yes啦~不然怎麼Run....=_=

2. 接著可以看到一堆Skype送過來的訊息產生的訊息視窗。

3. 接著就可以看到主視窗了

4. 在視窗上面點左鍵

5. Skype回傳訊息

如果以上步驟都完成,而你也都了解其中的意義的話,那Skype API應該就算是入門完畢了:)

6 則留言:

EricChan 提到...

你好。
最近工作关系要弄Skype API,写了个BCB的小程序,但发现发送了广播以后,第一个WM_COPYDATA之后的消息都接收不到了,搞了1天了,都搞不清楚问题出在哪!刚看了你的文章,才发现,原来callback那里要设置返回1才行,一试,果然可以了。真是太感谢你了。
最后说一句,我原来也以为这个API是可以直接使用的……谁知竟然还要开着个Skype才行,也够无聊的。呵呵

Falldog 提到...

當初我也是卡在那邊卡很久,所以想說po上blog分享給有需要的人:)

Sennin32'S 提到...

你好
是否可以請教一個問題
要做與skype連接並傳出"PING"字串
而連接成功後顯示"PONG"這個動作
是否可以不用視窗就做到呢??

Falldog 提到...

To Sennin32'S:
既然想在連接成功後「顯示"PONG"」,那當然需要視窗才能做到囉。

因為Skype API是透過Windows Message傳遞,所以你如果想在背後執行的話,可以直接將你的程式視窗預設就縮到最小即可。這樣子可能比較符合你的需求吧。

Sennin32'S 提到...

呃...
那是否可以像developer skype的範例一樣
只顯示出那個像DOS的畫面呢?

我是直接跑他的.exe檔的
因為我是了4.5種compiler都不能compile原始碼= =

然後還有一個問題
這個範例中
屬於skype API的部份是要傳給skype的
是"PING"
還是"SkypeControlAPIAttach跟
SkypeControlAPIDiscover"呢@@?

如果是其中一個
那另一個的功能是?

麻煩你了 這真是非常難懂啊

Falldog 提到...

呃...
我建議你先了解一下Win32的基本程式概念再來學習可能會比較快一點。你可以來這個網站學些基本的Win32概念

等基本概念都了解後,再回來看這個Skype API會比較簡單。

還有,這種Win32的程式,必須用Visual C++, Borland C++ Builder, Dev-C++...來Compile才可以。