顯示具有 Skype API 標籤的文章。 顯示所有文章
顯示具有 Skype API 標籤的文章。 顯示所有文章

31 1月 2009

初探Skype4Py

  在Skype API裡,除了之前介紹的Windows Message、Skype4Com的方法之外,還有一個Skype4Py可以使用。

  Skype4Py是用Python的語法,將Skype API包裝起來,提供一層high-level的介面供使用者使用,用法跟Skype4Com很類似,而且它還有一個特點,就是跨平台!寫出一個Skype4Py的Python程式,可以在Wiindows、Linux和Mac等不同的OS上執行。而這也是Python的特點之一。

  在我看過Skype4Py的source code後,原來它只是將不同平台上的Skype API底層的做法包裝起來,所以實際上它執行的方法,在Windows上,還是透過Windows Message傳遞的。有興趣的人可以參考看看。

安裝方法:
  1. 安裝Python 2.4以上的版本
  2. 安裝Skype
  3. 安裝Skype4Py

  就是這麼簡單,在安裝Skype4Py上,也提供了多種選則,在Windows上可以安裝exe執行檔,或是下載source code自行下指令安裝。

  在安裝完成後,就可以寫個小小的簡單測試程式:
import Skype4Py

# Create Skype instance
skype = Skype4Py.Skype()

# Connect Skype object to Skype client
skype.Attach()

print 'Your full name:', skype.CurrentUser.FullName
print 'Your contacts:'
for user in skype.Friends:
print ' ', user.FullName
  寫法相當的簡潔,這樣子就可以取得好友清單了。Skype4Py的另一項特點,就是它的線上Document格式長得很像JavaDoc的格式,個人覺得在使用上是頗為方便。

相關網頁:

29 1月 2009

Skype API - DTMF介紹

  在一般的電話對談中,如果我們不小心按到了電話上的按鍵(0~9, #, *),此時會響起一個嗶嗶聲,這個聲響就是以DTMF的方式編碼傳送,每個按鍵都有各自獨有的頻率,所以照理來說,只要對方可以解析傳來的DTMF頻率,即可知道傳來的按鍵為何,可以讓對方做進一步的處理…(如,撥打分機號碼)

  而在Skype的AP中,也有著類似的介面供使用者在通話中,按下畫面上虛擬的按鍵,即會發出DTMF Tone了。而 Skype API 也有提供解析DTMF code的方法,很是方便。

  Skype API 提供了一個Command供使用者送出/接收DTMF code,「SET CALL DTMF」,在Skype4Com裡,也提供了一個Event,當收到DTMF code時,就會觸發「CallDtmfReceived」Event,不過在使用上還是有些限制…
  1. 使用者只能接收到對方送來的DTMF code。當自己送出DTMF code時,並不會觸發CallDtmfReceived Event。
  2. 在Skype4Com的Document中提到,「This event can be received with P2P calls」,所以似乎只限定在P2P的通話上( Skype AP<->Skype AP ),不支援手機<->Skype AP。

範例程式:
範例程式下載連結

#include <vcl.h>
#include <iostream>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SKYPE4COMLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;

// 這個程式是用來測試Skype4Com的一些功能
// (1) 要執行這個程式 首先要將$(BCB)/Imports/加入 Include Path
// #include "SKYPE4COMLib_OCX.h"
// (2) 需要新增以下的元件:
// TListBox *ListBox1;
// TMemo *Memo1;
// (3) 需要額外宣告變數:
// TSkype * mSkype;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
mSkype = new TSkype(Owner);
mSkype->Attach(5,false);

// test if Skype is running, if not, start it;
if( !mSkype->Client->IsRunning )
mSkype->Client->Start(false,false);
// 1st parameter - start Skype in minimized state
// 2nd parameter - show splash screen

// Get the count of Friends
int count = mSkype->Friends->get_Count();

// Add Friend list to Memo
for( int i=1 ; i<count ; i++ )// start index from 1 !!!
this->ListBox1->Items->Add( mSkype->Friends->get_Item(i)->get_Handle() );

// bind the Skype Event.
mSkype->OnCallDtmfReceived = OnCallDtmfReceived;
}

// Skype4Com的Event
// 在Skype4Com.chm中定義的 Class : _SkypeEvents 裡面
// HRESULT CallDtmfReceived ([in] ICall *pCall,[in] BSTR Code)
// This event is caused by a call DTMF event.
// 經由BCB處理過後的header檔,定義在 $(BCB)/Imports/SKYPE4COMLib_OCX.h 100行
//
// @target : when receive the DTMF code, print on Memo.
void __fastcall TForm1::OnCallDtmfReceived( TObject *Sender, ICall* pCall/*[in]*/, BSTR code/*[in]*/)
{
this->Memo1->Lines->Add( "OnCallDtmfReceived" );
if( pCall!=NULL ){
this->Memo1->Lines->Add( AnsiString("DTMF Code : ")+WideString(code) );
}
}

補充:
在coding時的測試要透過兩個不同的Skype AP,一般的情況下都得在兩台安裝Skype AP的電腦上測試,建議可以用官網提供的Skype Launcher這個小程式,就能在一台電腦上執行多個Skype AP了。

相關連結:

04 1月 2009

做中學 - Skype API Tracer

第一次接觸Skype API的人,看完上一篇介紹Skype API架構的文章後,可能還是霧煞煞的,不太清楚在講什麼東東,沒關係,在這邊我們可以藉由一個Skype官網提供的 Tool - Skype API Tracer 的幫忙,來更加了解Skype API到底在搞什麼 、怎麼搞的!?

首先,必須先到 Skype Download 頁面下載 Skype API Tracer 這個 Tool。

接著,開啟你電腦上的Skype,並啟動 Skype API Tracer,操作介面如下:

操作介面非常的簡潔明瞭,這個Tool就是透過Skype API去操控原本的Skype主程式,比如,在指令輸入欄位輸入「PING」後,就會回傳「PONG」。

也可以輸入指令,取得目前登入Skype帳號的好友清單,輸入「SEARCH FRIENDS」,接著就會回傳「USERS echo123, xxx1, xxx2, xxx3, ....」回傳好友清單中,每個好友的帳號的串列,並以分號「,」為間隔。

當然除了取得帳號相關的資訊外,也可以針對Skype的視窗處理的API,如「MINIMIZE 」,輸入後,Skype主程式的視窗就會自動最小化。輸入「OPEN DIALPAD」後會出現Skype的撥號介面。

當然也可以透過指令,讓Skype撥電話給某位使用者,比如我想打電話給我的朋友SummerDog,就輸入「Call SummerDog」即可,Skype會自動幫你處理接下來撥號的動作。

所以,說穿了,Skype API也不過是個文字遊戲,我們丟給它一些文字指令,它可以選擇吃不吃這些指令,不吃就吐個錯誤訊息給你,吃的下去,就幫你處理一些事情,或是回傳一些有用的訊息給你。
而這些文字訊息都必須透過Windows Message去傳遞,而且必須注意的是,文字訊息的內容,必須用UTF-8的編碼格式才行,不然文字訊息一有中文的內容,而Programmer又不將中文encoding成UTF-8的編碼(在程式裡,預設編碼應該是Big5),Skype會完全看不懂這訊息,就不會理你了。

以上介紹的這些API指令,都可以在官網找到說明與簡易教學,在這邊列出給大家參考一下:

可以用的API指令還滿多的,有興趣的人,可以先使用Skype API Tracer先與Skype溝通一下後,再試著寫入程式裡面,會更有效率~

以上介紹的API指令,都是屬於Windows Message傳遞去控制Skype,其實還有另一個方法,可以用Function的概念去處理Skype API的架構 - Skype4Com,有興趣的人可以參考一下拙作。

17 7月 2008

Skype4Com in BCB範例 - 將Call In的使用者加入Conference中

  在Skype中,當使用者目前有一個通話正在進行,而其他使用者想要加入此通話,則變成為三方通話(即Skype中的多方通話功能),此多方通話稱為一個Conference。使用Skype4Com的功能,只要將新Call In進來的電話,呼叫Join( ConferenceId )的Function,傳入目前正在進行中的Call的ConferenceId,即可達到此功能。

以下有範例程式檔,供參考:
Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "SKYPE4COMLib_OCX.h"
#include <OleCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
long mConferenceId;
TSkype * mSkype;

__fastcall TForm1(TComponent* Owner);
void __fastcall OnCallStatus( TObject *Sender, ICall* pCall/*[in]*/, TCallStatus Status/*[in]*/);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



Unit1.cpp
#include <vcl.h>
#include <iostream>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SKYPE4COMLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;

using namespace std;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
mSkype = new TSkype(Owner);
mSkype->Attach(5,false);

// test if Skype is running, if not, start it;
if( !mSkype->Client->IsRunning )
mSkype->Client->Start(false,true);
// 1st parameter - start Skype in minimized state
// 2nd parameter - show splash screen

//註冊Skype4Com的CallStatus Event
mSkype->OnCallStatus = OnCallStatus;
}

// Call 一位使用者
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ICallPtr call = mSkype->PlaceCall(L"falldog7_test",L"",L"",L"");
}

// 當有使用者Call In進來,則自動接起電話
// 第一位使用者打入,記錄ConferenceId
// 其後打入的使用者,加入此Conference
void __fastcall TForm1::OnCallStatus( TObject *Sender, ICall* _call/*[in]*/, TCallStatus Status/*[in]*/)
{
if( Status == clsRinging ){
if( mConferenceId > 0 ){
_call->Join( mConferenceId );
_call->Answer();
}
else{
_call->Answer();
mConferenceId = _call->ConferenceId;
}
}
}

Skype4Com in BCB範例 - Call其他使用者

在Skype4Com裡,如果要Call Out給其他使用者,有兩種方法可以做到。

1. 使用Skype4Com的Function:PlaceCall
  這個方法是Skype4Com現成的Function,但是同一時間Call Out的人數上限只有4人...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ICallPtr call = mSkype->PlaceCall( L"falldog7_test", L"falldog7_test2", L"", L"" );
}


2. 使用Skype4Com的Command模式
  這個方法,就好像是使用Windows Message傳送Command的方式一樣,將要傳給Skype的指令儲存在一字串裡,再將此字串傳送給Skype4Com即可。這個方法就沒有人數的上限了!
  因此在這個方法裡,可以將使用者的名稱接在Call指令的後面即可。詳細的官網說明。使用Skype4Com提供的Command[ID][Command][Reply][Block][Timeout],取得一個ICommand的物件,再將此Command送給Skype4Com即可。
  • ID:Command的ID,可以自行指定
  • Command:Command的內容,必須為wchar_t字串
  • Reply:預期回傳的字串,預設為""
  • Block:是否等待Skype完成此動作
  • Timeout:Block的Timeout時間,單位為ms(豪秒),預設為30000
void __fastcall TForm1::Button2Click(TObject *Sender)
{
WideString call_user_list = L"Call falldog7_test, falldog7_test2";
ICommandPtr cmd = mSkype->Command[1][ call_user_list.c_bstr() ][L""][true][5000];
mSkype->SendCommand(cmd);
}

28 2月 2008

Skype4Com in BCB 的一些範例

Skype4Com在BCB上的應用,其實官網上的資料給的並不多,只是有Delphi的範例可以看一下(註:我不會寫Delphi啊~~~~~XD) 還好在論壇上找到一些些的資料,然後再靠自己的一些摸索後,終於抓到一些訣竅了。以下是一個簡單測試一些Skype4Com的Code,有興趣的可以試試看。

比較需要注意的是,由於Skype4Com下載下來的壓縮檔裡面的說明檔Skype4Com.chm,裡面所說到的Class name, Function name都不能直接用,因為Skype4Com.dll已經透過BCB封裝過了,所以必須按照BCB編過後的方式去處理才行,封裝過後的檔案在$(BCB)/Imports/裡,有四個檔案,包括SKYPE4COMLib_OCX與SKYPE4COMLib_TLB的.cpp與.h檔。以下的範例有提到,請參考。

#include <vcl.h>
#include <iostream>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SKYPE4COMLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;

// 這個程式是用來測試Skype4Com的一些功能
// (1) 要執行這個程式 首先要將$(BCB)/Imports/加入 Include Path
// #include "SKYPE4COMLib_OCX.h"
// (2) 需要新增以下的元件:
// TListBox *ListBox1;
// TButton *Button1;
// TButton *Button2;
// TButton *Button3;
// TMemo *Memo1;
// (3) 需要額外宣告變數:
// TSkype * mSkype;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
mSkype = new TSkype(Owner);
mSkype->Attach(5,false);

// test if Skype is running, if not, start it;
if( !mSkype->Client->IsRunning )
mSkype->Client->Start(false,false);
// 1st parameter - start Skype in minimized state
// 2nd parameter - show splash screen

// Get the count of Friends
int count = mSkype->Friends->get_Count();

// Add Friend list to Memo
for( int i=1 ; i<count ; i++ )// start index from 1 !!!
this->ListBox1->Items->Add( mSkype->Friends->get_Item(i)->get_Handle() );

// 設置處理Skype Event的function
mSkype->OnCallStatus = OnCallStatus;
mSkype->OnMessageStatus = OnMessageStatus;
}


// @target :
// Create 一個Chat Object
// 並傳送訊息給 Friend "falldog7_test"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IChatPtr chat;
chat = mSkype->CreateChatWith( L"falldog7_test" );
//開啟對話視窗
chat->OpenWindow();
//傳送訊息過去給falldog7_test
chat->SendMessage( L"Fuck You!" );
chat->Disband();
}

// @target :
// 撥電話給 好友 : "falldog7_test"
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ICallPtr call = mSkype->PlaceCall(L"falldog7_test",L"",L"",L"");
}

// @target :
// 取出所有正在通話的 Call ,並將其所有的OutputDevice導至(1) Soundcard (2) File
void __fastcall TForm1::Button3Click(TObject *Sender)
{
wstring path = L"D:\\WorkRoom\\project-中文也行\\test.wav";
ICallCollectionPtr call_list = mSkype->ActiveCalls;
for( int i=1; i<=call_list->Count ; i++ ){
call_list->get_Item(i)->set_OutputDevice( callIoDeviceTypeSoundcard, L"default" );
call_list->get_Item(i)->set_OutputDevice( callIoDeviceTypeFile, const_cast<wchar_t*>(path.c_str()) );
this->Memo1->Lines->Add( "OutputDevice direct success!" );
}
}

// Skype4Com的Event
// 在Skype4Com.chm中定義的 Class : _SkypeEvents 裡面
// HRESULT CallStatus ([in] ICall *pCall,[in] TCallStatus Status)
// This event is caused by a change in call status.
// 經由BCB處理過後的header檔,定義在 $(BCB)/Imports/SKYPE4COMLib_OCX.h 88行
//
// @TCallStatus 的定義在Skype4Com.chm 與 SKYPE4COMLib_TLB.h中都找得到
// @target : 當有人Call我時(Ringing) 就直接接起此通Call
void __fastcall TForm1::OnCallStatus( TObject *Sender, ICall* _call/*[in]*/, TCallStatus Status/*[in]*/)
{
if( Status == clsRinging ){
// ShowMessage("A Call is Rining");
_call->Answer();
}
}

// Skype4Com的Event
// 在Skype4Com.chm中定義的 Class : _SkypeEvents 裡面
// HRESULT MessageStatus ([in] IChatMessage *pMessage,[in] TChatMessageStatus Status)
// This event is caused by a change in chat message status.
// 經由BCB處理過後的header檔,定義在 $(BCB)/Imports/SKYPE4COMLib_OCX.h 93行
//
// @TChatMessageStatus 的定義在Skype4Com.chm 與 SKYPE4COMLib_TLB.h中都找得到
// @target : 當有人傳訊息給我時,就在Memo1上印出訊息
void __fastcall TForm1::OnMessageStatus( TObject *Sender, IChatMessage* pMessage/*[in]*/, TChatMessageStatus Status/*[in]*/)
{
this->Memo1->Lines->Add( AnsiString("From : ")+ pMessage->FromHandle );

if( Status == cmsReceived ){
this->Memo1->Lines->Add( AnsiString("Msg : ")+ pMessage->Body );
}
}
範例檔下載連結

31 1月 2008

Skype4Com in BCB

Skype4Com在BCB中實現有兩種方法
  1. 一種是廣為人知的透過Variant去控制Com的物件
  2. 另一種是使用BCB強大的功能,將Skype4Com.dll解析後,直接使用其中的class
以下將各給一個例子,去取得「好友清單」的列表,再把它列到Memo元件中。


法1 : 透過Variant去控制Com的物件
// Prepare Setp :
// 1. Add a Memo to the Form1
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Memo1->Clear();

//Create a Skype Com object
Variant oSkype;
oSkype = Variant::CreateObject("Skype4COM.Skype");
// test if Skype is running, if not, start it;
if( !oSkype.OlePropertyGet("Client").OlePropertyGet("IsRunning") )
oSkype.OlePropertyGet("Client").OleFunction("Start");

// Connect to Skype via API
oSkype.OleFunction("Attach");

// Get all firends
Variant friends = oSkype.OlePropertyGet("Friends");
int count = friends.OlePropertyGet( "Count" );
Memo1->Lines->Add( "User Count : "+IntToStr(count) );

// Add to Memo
for( int i=1 ; i<=count ; i++ )//start index from 1 !!!
Memo1->Lines->Add( friends.OlePropertyGet("Item", i).OlePropertyGet("Handle") );
}
//---------------------------------------------------------------------------



法2 :

  1. 下載Skype4Com Releas,解壓縮出Skype4Com.dll
  2. 打開BCB,點選Component -> Import ActiveX Control -> Add Skype4Com.dll -> Install
  3. 至元件列表中,點選「ActiveX」,看看有沒有出現「Skype」這個Icon,有的話,就是成功了
  4. 拉一個Skype元件下來,即可使用TSkype這個class了
  5. 切記:Skype4Com.dll的位置不能改變,否則BCB會出錯
// Prepare step :
// 1. Add a Skype to Form
// 2. Add a Memo to Form
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Skype = new TSkype(Owner);
Skype->Attach(5,false);

// test if Skype is running, if not, start it;
if( !Skype->Client->IsRunning )
Skype->Client->Start(false,false);
// 1st parameter - start Skype in minimized state
// 2nd parameter - show splash screen

// Get the count of Friends
int count = Skype->Friends->get_Count();
Memo1->Lines->Add( IntToStr(count) );

// Add Friend list to Memo
for( int i=1 ; i<count ; i++ )// start index from 1 !!!
Memo1->Lines->Add( Skype->Friends->get_Item(i)->get_Handle() );

}
//---------------------------------------------------------------------------
延伸閱讀:

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說明檔)

延伸閱讀:

03 10月 2007

Skype API example in BCB

因為我未來的開發環境是在BCB上,因此在這邊寫了個簡單的BCB的小程式,可以與Skype連線,並送出最簡單的"PING" button。不過從最簡單的Win32 API轉至BCB時,遇到了不少難題,不過也一一克服了,在下面會詳細地說明。

在這邊的步驟可以對照Win32 API simple example這篇文章,流程是差不多的,只是實作的方法不一樣而已。

我的code在這邊…http://falldog7.googlepages.com/Skype_BCB.rar

首先遇到的問題就是...指定處理Message的Function,不能由BCB定義的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP來處理。因為BCB背後所處理的方式是#define ...,所以這些Message的Message ID必須是compile前就定義好的"常數"(Ex: WM_USR+n),而我們要處理的Skype Message是在程式開始執行後,透過RegisterWindowMessage()所獲得的動態Messag ID,所以當你用BEGIN_MESSAGE_MAP來定義處理uiGlobal_MsgID_SkypeControlAPIAttach,會出現這種錯誤:
E2313 Constant expression required
因此,要定義這種由RegisterWindowMessage()取得的MessageID的處理function,可以做WndProc()的Override(覆寫)。
在class TForm1中定義:

virtual void __fastcall WndProc(TMessage&);


WndProc()的Defination...
//WndProc() Overloading
void __fastcall TForm1::WndProc(TMessage & msg){
TForm::WndProc(msg);//用基本的WndProc函数讓Windows其他程式去處理~
//....
}

不過這種作法要小心,因為你可能把其他的Message都給吃下來,記得要呼叫base WndProc()去處理其他的Message

第二個比較需要注意的問題就是當接收到WM_COPYDATA的時候,要return 1; 而WndProc()一定要定義成void,所以一開始讓我很困擾,讓我不知所措,想說把void改成UINT,結果連compile都不會過了... 後來才知道,原來void WndProc(TMessage & msg);其中的參數TMessage可以設定return的值。所以只要當我們接收到WM_COPYDATA時,將msg的return值設為1即可,這樣Skype就不會Disconnect了!

if(msg.Msg==WM_COPYDATA){
// ...
msg.Result = 1;
}

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應該就算是入門完畢了:)

談談Skype API

Skype最近真是愈來愈火熱了,隨著網路電話的興起、Skype手機的出現、Wi-Max標準的制定,再再都表示,Skype日後真是無可限量啊!!! 連我的論文也跟Skype有關係了~因為Skype大方公開API的關係,讓更多人可以開發與Skype相關的軟體,我想對Skype也是有所助益啊。

Skype API雖然推出一段時間,但是我在Google上找到的中文資料卻是少之又少, 因此,我只能上去Skype API的官網看著原文的資料...(喔~殺了我吧~英文是我的罩門...) 等到略有了解後,才上到論壇去找更多人討論的資料,因為我以後的開發環境是BCB,但是論壇上的人大都是在VC上開發較為多數=_=,怎麼這麼不順利啊我...還好我集給智慧與勇氣於一身,PO了一篇文章指出我的問題,幸好有BCB的高手幫了我一個大忙~現在我已經寫出最最最簡單的程式了,哈哈哈。


學習Skype API的可去之處:


Skype API 的架構與概念:
Skype API 簡單的說,就是透過Windows Message去控制正在執行的Skype程式,也就是說不執行Skype的話,就不能使用 Skype API 了。一開始我還以為是可以直接Call它的library咧,結果並非我所想的那樣。

....如果想更深入了解 Skype API 的程式, 請繼續參考站上的其他文章~

Skype API 專欄報導

01 1月 2000

Skype API

Skype提供了Skype API給開發者使用,而Skype API並非像一般的Library一樣,不如說是Plugin的開發套件還比較貼切。因為Skype API只能「控制Skype」,並不能直接存取Skype的Library。

Skype API提供了兩方法:(1) Windows Message (2) Com 控制Skype,以下寫了一些文章介紹Skype API,請客倌們慢用吧。

● Windows Message

● Skype4Com

● Skype4Py