SKYPE API程序的二次开发
更新时间:2024-04-24 10:10:01 阅读量: 综合文库 文档下载
- skype是什么软件推荐度:
- 相关推荐
我是从SKYPE 0.几版本就开始进行SKYPE的二次开发的,那个时候SKYPE 还没有开放SDK出来,只能是通过 钩子和模拟按键 的方式做到对 来电去电的控制。哪个时候很苦闷,也很没有底气,毕竟都是类似于hacker的操作。但是老板就是老板,他要求什么功能我就得想方设法实现它,谁叫我不是老板呢,赫赫。后来,SKYPE出了论坛,再后来有了SDK,我终于舒服了,一切都变得那么Easy,虽然它SDK提供得功能是一步
一步枝繁叶茂的。
到现在,通过SKYPE SDK对skype的控制已经很完整了,当然这是指Windows下的版本,因为Windows 的版本的SDK 协议已经到了protocol 7了,而且SKYPE 3.2出来后又增加了很多新的控制(不知道protocol 版本升级了没有);而Linux下的SDK 虽然到了protocol 5,但是其实很多命令发过去,它都没有反映(它没有报错,没有报错就表示它能理解该命令,但是却
没有反映,如果它无法理解它会返回错误信息)。 我用的linux的发行版是Fedora Core 4,SKYPE的版本是最新的FC4下的版本(才1.3.几,对比windows用户,真的很惨), API程序是用QT3.3写的界面。我感觉Fedora Core 4下对 USB Phone这类高耗电设备的支持还是有很大的问题,在不运行我的AP的情况下,插拔几次(次数不确定)设备,电脑就可能
当机;我试过几台电脑,都有一样的问题。而且,如果开机的时候设备是连着的,第一次连我的API程序,铁定连不上,插拔一次就可以了(我的AP可以不退出),这个问题我一直没办法理解。同时USB Phone的麦克风在Fedora Core4下也很容易出问题,情况是 出问题后用户根本没办法控制麦克风,当然也没
有声音,重启几次后就好了,同时声音也出来了。 如果我有什么理解错误,希望大家指出来,不要让我冷场了。
如果有什么问题,也可以根贴提出来。谢谢。 并贴上SKYPE官方提供的Windows下API调用例程的源代
码。 // tab size: 2
// following special commands are recognized and han
dled by this client
// #quit // #exit // terminate client
// #dbgon
// turn on debug printing of windows messages
// #dbgoff
// turn off debug printing of windows messages
// #connect // discover skype api
// #disconnect
// terminate connection to skype api
// all other commands are sent \is\directly to Skyp
e
// (no UTF-8 translation is done at present)
#include
HINSTANCE hInit_ProcessHandle; char acInit_WindowClassName[128]; HANDLE hGlobal_ThreadShutdownEvent; bool volatile fGlobal_ThreadRunning=true; UINT uiGlobal_MsgID_SkypeControlAPIAttach; UINT uiGlobal_MsgID_SkypeControlAPIDiscover; HWND hGlobal_SkypeAPIWindowHandle=NULL;
#if defined(_DEBUG)
bool volatile fGlobal_DumpWindowsMessages=true;
#else
bool volatile fGlobal_DumpWindowsMessages=false;
#endif
DWORD ulGlobal_PromptConsoleMode=0;
HANDLE volatile hGlobal_PromptConsoleHandle=NULL;
enum {
SKYPECONTROLAPI_ATTACH_SUCCESS=0, // Client is successfully attached and API window handle can be fo
und in wParam parameter
SKYPECONTROLAPI_ATTACH_PENDING_AUTHORIZATION=1, // Skype has acknowledged connection request a
nd is waiting for confirmation from the user. // The client is not yet attached and should wait for SKYPECONTROLAPI_ATTACH_SUCCESS message SKYPECONTROLAPI_ATTACH_REFUSED=2, // User h
as explicitly denied access to client
SKYPECONTROLAPI_ATTACH_NOT_AVAILABLE=3, // API is not available at the moment. For example, this hap
pens when no user is currently logged in. // Client should wait for SKYPECONTROLAPI_ATTACH_API_AVAILABLE broadcast before making any further
// connection attempts.
SKYPECONTROLAPI_ATTACH_API_AVAILABLE=0x800
1 };
bool Global_Console_ReadRow( char *pacPromptBuffer,
unsigned int uiMaxLength)
{
HANDLE hConsoleHandle, hDuplicatedConsoleHandle;
DWORD ulCharactersRead, ulConsoleMode;
unsigned int uiNewLength; BOOL fReadConsoleResult;
bool fReturnStatus; char cCharacter; fReturnStatus=false;
while((hConsoleHandle=GetStdHandle(STD_INPUT_HAN
DLE))!=INVALID_HANDLE_VALUE)
{
if( DuplicateHandle( GetCurrentProcess(), hConsoleHan
dle,
GetCurrentProcess(), &hDuplicatedConsoleHandle, 0, F
ALSE,
DUPLICATE_SAME_ACCESS)==FALSE )
break;
GetConsoleMode( hDuplicatedConsoleHandle, &ulConsol
eMode);
SetConsoleMode( hDuplicatedConsoleHandle, ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT|ENABLE_ECH
O_INPUT);
hGlobal_PromptConsoleHandle=hDuplicatedConsoleHand
le;
ulGlobal_PromptConsoleMode=ulConsoleMode; fReadConsoleResult=ReadConsole( hGlobal_PromptCon
soleHandle,
(LPVOID)pacPromptBuffer, uiMaxLength, &ulCharacters
Read, (LPVOID)0);
if( hGlobal_PromptConsoleHandle==(HANDLE)0 )
break;
hGlobal_PromptConsoleHandle=(HANDLE)0;
SetConsoleMode( hDuplicatedConsoleHandle, ulConsole
Mode);
CloseHandle(hDuplicatedConsoleHandle);
if( fReadConsoleResult==FALSE || ulCharactersRead>ui
MaxLength )
break;
pacPromptBuffer[ulCharactersRead]=0; uiNewLength=ulCharactersRead;
while(uiNewLength!=0)
{
cCharacter=pacPromptBuffer[uiNewLength-1]; if( cCharacter!='r' && cCharacter!='n' )
break; uiNewLength--;
}
pacPromptBuffer[uiNewLength]=0;
fReturnStatus=true;
break; }
if( fReturnStatus==false ) pacPromptBuffer[0]=0; return(fReturnStatus);
}
void Global_Console_CancelReadRow(void)
{
if( hGlobal_PromptConsoleHandle!=(HANDLE)0 )
{
SetConsoleMode( hGlobal_PromptConsoleHandle, ulGlo
bal_PromptConsoleMode);
CloseHandle(hGlobal_PromptConsoleHandle); hGlobal_PromptConsoleHandle=(HANDLE)0;
}
}
static LRESULT APIENTRY SkypeAPITest_Windows_Wi
ndowProc(
HWND hWindow, UINT uiMessage, WPARAM uiParam,
LPARAM ulParam)
{
LRESULT lReturnCode; bool fIssueDefProc; lReturnCode=0; fIssueDefProc=false; switch(uiMessage)
{
case WM_DESTROY: hInit_MainWindowHandle=NULL;
PostQuitMessage(0);
break;
case WM_COPYDATA:
if( hGlobal_SkypeAPIWindowHandle==(HWND)uiParam )
{
PCOPYDATASTRUCT poCopyData=(PCOPYDATASTR
UCT)ulParam;
printf( \from Skype(%u): %.*sn\poCopyData->dwData, poCopyData->cbData, poCopyData->lpData);
lReturnCode=1;
} break; default:
if( uiMessage==uiGlobal_MsgID_SkypeControlAPIAttach
) {
switch(ulParam)
{
case SKYPECONTROLAPI_ATTACH_SUCCESS: printf(\Connected; to terminate issue #disconnectn\hGlobal_SkypeAPIWindowHandle=(HWND)uiParam;
break;
case SKYPECONTROLAPI_ATTACH_PENDING_AUTH
ORIZATION:
printf(\Pending authorizationn\
break;
case SKYPECONTROLAPI_ATTACH_REFUSED:
printf(\Connection refusedn\
break;
case SKYPECONTROLAPI_ATTACH_NOT_AVAILABLE:
printf(\Skype API not availablen\
break;
case SKYPECONTROLAPI_ATTACH_API_AVAILABLE:
printf(\Try connect now (API available); issue #conn
ectn\break; }
lReturnCode=1;
break; }
fIssueDefProc=true;
break; }
if( fIssueDefProc )
lReturnCode=DefWindowProc( hWindow, uiMessage, ui
Param, ulParam);
if( fGlobal_DumpWindowsMessages )
{
printf( \hWindow=0xX, MainWindow=0xX, Message=%5u, WParam=0xX, LParam=0x
X; Return=%ld%sn\
hWindow, hInit_MainWindowHandle, uiMessage, uiParam, ulParam, lReturnCode, fIssueDefProc? \(default)\
}
return(lReturnCode);
}
bool Initialize_CreateWindowClass(void)
{
unsigned char *paucUUIDString; RPC_STATUS lUUIDResult;
bool fReturnStatus; UUID oUUID; fReturnStatus=false;
lUUIDResult=UuidCreate(&oUUID);
hInit_ProcessHandle=(HINSTANCE)OpenProcess( PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId()); if( hInit_ProcessHandle!=NULL && (lUUIDResult==RPC_S_OK || lUUIDResult==RPC_S_UUID_LOCAL_ONLY) )
{
if( UuidToString( &oUUID, &paucUUIDString)==RPC_S_
OK )
{
WNDCLASS oWindowClass;
strcpy( acInit_WindowClassName, \strcat( acInit_WindowClassName, (char *)paucUUIDStrin
g);
oWindowClass.style=CS_HREDRAW|CS_VREDRAW|CS
_DBLCLKS;
oWindowClass.lpfnWndProc=(WNDPROC)&SkypeAPITes
t_Windows_WindowProc; oWindowClass.cbClsExtra=0;
if( stricmp( acInputRow, \)
{
hGlobal_SkypeAPIWindowHandle=NULL;
printf(\Disconnectedn\
fProcessed=true;
}
if( fProcessed==false && hGlobal_SkypeAPIWindowHan
dle!=NULL )
{
COPYDATASTRUCT oCopyData; // send command to skype oCopyData.dwData=0; oCopyData.lpData=acInputRow; oCopyData.cbData=strlen(acInputRow)+1;
if( oCopyData.cbData!=1 )
{
if( SendMessage( hGlobal_SkypeAPIWindowHandle, WM_COPYDATA, (WPARAM)hInit_MainWindowHandle, (LPA
RAM)&oCopyData)==FALSE )
{
hGlobal_SkypeAPIWindowHandle=NULL;
printf(\Disconnectedn\
} } } } }
PostMessage( hInit_MainWindowHandle, WM_CLOSE, 0,
0);
SetEvent(hGlobal_ThreadShutdownEvent);
fGlobal_ThreadRunning=false;
}
void main(void)
{
// create window class
// create dummy/hidden window for processing messag
es
// run message loop thread // do application control until exit
// exit: send QUIT message to our own window
// wait until thred terminates // destroy main window // destroy window class
uiGlobal_MsgID_SkypeControlAPIAttach=RegisterWindow
Message(\
uiGlobal_MsgID_SkypeControlAPIDiscover=RegisterWind
owMessage(\
if( uiGlobal_MsgID_SkypeControlAPIAttach!=0 && uiGlo
bal_MsgID_SkypeControlAPIDiscover!=0 )
{
if( Initialize_CreateWindowClass() )
{
if( Initialize_CreateMainWindow() )
{
hGlobal_ThreadShutdownEvent=CreateEvent( NULL, TR
UE, FALSE, NULL);
if( hGlobal_ThreadShutdownEvent!=NULL )
{
if( _beginthread( &Global_InputProcessingThread, 64*10
24, NULL)!=(unsigned long)-1 )
{
Global_MessageLoop(); Global_Console_CancelReadRow();
WaitForSingleObject( hGlobal_ThreadShutdownEvent, IN
FINITE);
}
CloseHandle(hGlobal_ThreadShutdownEvent);
}
DeInitialize_DestroyMainWindow();
}
DeInitialize_DestroyWindowClass();
} } }
正在阅读:
SKYPE API程序的二次开发04-24
界面现象题目--答案参考11-24
锅炉安全知识01-07
交通运输-公安交通安全宣传工作中市场营销理念的可行性运用探析05-18
会计建账——新手入门08-14
音韵学常识10-16
各省军区独立师历史沿革04-25
暨南大学生态毒理学03-27
2013反假币考试模拟练习题试题501-09
江苏科技大学南校区学工人员值班安排表03-11
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 程序
- 开发
- SKYPE
- API