获得qq的聊天内容
这种方式也可用于其它聊天工具
使用spy++看QQ2003的聊天窗口,采用一名为RichEdit20A来存放qq的聊天内容.
只要找到聊天窗口的句柄,然后找到RichEdit20A的句柄,就可以发消息将内容
放到剪贴板中,然后就可以从剪贴板中取出我们感兴趣的内容.
主要函数:
//枚举所有运行的窗口,将该窗口的句柄传给自己定义的函数EnumWindowsProc
EnumWindows(EnumWindowsProc,0);
//找到qq的聊天的窗口
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR buff[1000];
int buffsize(100),nPosition(-1);
HWND hQQWnd=NULL;
::GetWindowText(hwnd,buff,buffsize);
if (strlen(buff)<1)
return TRUE;
CString str(buff);
nPosition=str.Find(_T("聊天"));
if(nPosition!=-1)
EnumChildWindows(hwnd,ChildWndProc,0);
return TRUE;
}
//枚举qq聊天的窗口的所有子窗口,找到类名为RichEdit20A的子窗口
//将内容get出来,放到全局变量strEdit中
BOOL CALLBACK ChildWndProc(HWND hwnd, LPARAM lParam)
{
LPTSTR lptstr;
HGLOBAL hglb=NULL;
char className[CLASS_SIZE];
if (GetClassName(hwnd,className,CLASS_SIZE)==0)
return TRUE;
CString str(className);
if(str==_T("RichEdit20A"))
{
::SendMessage(hwnd,EM_SETSEL,0,-1);
::SendMessage(hwnd,WM_COPY,0,0);
::SendMessage(hwnd,EM_SETSEL,-1,0);
if (! ::OpenClipboard(NULL))
return TRUE;
if (!IsClipboardFormatAvailable(CF_TEXT))
return TRUE;
hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
lptstr = (LPTSTR)GlobalLock(hglb);
GlobalUnlock(hglb);
EmptyClipboard();
CloseClipboard();
strEdit=lptstr;
return TRUE;
}
}
return TRUE;
}
摘自:http://www.vctop.com/View.asp?ID=473&CateID=1
浙公网安备 33010602011771号