2.实现文件
QQChatWnd.cpp// QQChatWnd.cpp: implementation of the CQQChatWnd class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "MyQQChat.h"
#include "QQChatWnd.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CQQChatWnd::CQQChatWnd()
{
m_nSysMode = 0 ;
m_hChatWnd = NULL ;
m_hSendButtonWnd = NULL;
m_hModeWnd =NULL;
m_hChatRichEditWnd =NULL;}CQQChatWnd::~CQQChatWnd()
{
  if( m_hChatWnd!= NULL)
  Detach( m_hChatWnd ) ;
}bool CQQChatWnd::Attatch(HWND hChatWnd)
{
if( m_hChatWnd!= NULL)
Detach( m_hChatWnd ) ; EnumChildWindows( hChatWnd , SearchRichEditEnumProc,(LPARAM)&m_hChatRichEditWnd) ;
EnumChildWindows( hChatWnd , SearchSysModeEnumProc ,(LPARAM)&m_hModeWnd) ;
EnumChildWindows( hChatWnd , SearchSendButtonEnumProc ,(LPARAM)&m_hSendButtonWnd) ;
TCHAR szDefCaptionName01[]="消息模式(&T)" ;
TCHAR szDefCaptionName02[]="聊天模式(&T)" ;
TCHAR szCaptionName[64]  ; memset( szCaptionName , 0x0 , 64 ) ;
GetWindowText( m_hModeWnd , szCaptionName , 64 ) ;
if( _stricmp(szCaptionName, szDefCaptionName01 ) ==0)
{
m_nSysMode =MSG_CHAT_MODE  ; 
}
if( _stricmp(szCaptionName, szDefCaptionName02 ) ==0)
{
m_nSysMode =P2P_CHAT_MODE ;
}


return TRUE ;
}bool CQQChatWnd::Detach(HWND hChatWnd)
{
m_nSysMode = 0 ;
m_hChatWnd = NULL ;
m_hSendButtonWnd = NULL;
m_hModeWnd =NULL;
m_hChatRichEditWnd =NULL; return TRUE ;
}
bool CQQChatWnd::GetChatRichEditWnd(HWND *pChatRichEditWnd)
{
if( m_hChatRichEditWnd!=NULL && IsWindow( m_hChatRichEditWnd ) )
{
*pChatRichEditWnd = m_hChatRichEditWnd ;
return TRUE ;
}

return FALSE ;
}int CQQChatWnd::GetSysMode()
{
   return m_nSysMode ;
}bool CQQChatWnd::GetModeWnd(HWND *pModeWnd)
{
if( m_hModeWnd!=NULL && IsWindow( m_hModeWnd ) )
{
*pModeWnd = m_hModeWnd ;
return TRUE ;
}

return FALSE ;
}bool CQQChatWnd::ChangeSysMode(int nSysMode)
{
  if( (nSysMode!= MSG_CHAT_MODE)  && (nSysMode != P2P_CHAT_MODE) )
  return FALSE ;
  if( nSysMode != m_nSysMode && m_hModeWnd!=NULL  && IsWindow(m_hModeWnd) )
  {
  SendMessage( m_hModeWnd , WM_LBUTTONDOWN , NULL ,NULL ) ;
  SendMessage( m_hModeWnd , WM_LBUTTONUP , NULL ,NULL ) ;
  m_nSysMode = nSysMode ;
  }
  return TRUE ;
}bool CQQChatWnd::GetSendButtonWnd(HWND *pSendButtonWnd)
{
if( m_hSendButtonWnd!=NULL && IsWindow( m_hSendButtonWnd ) )
{
*pSendButtonWnd = m_hSendButtonWnd ;
return TRUE ;
}

return FALSE ;
}bool CQQChatWnd::GetChatText(char **lplpstrText/*out*/)
{
if(*lplpstrText!=NULL)
return FALSE ;
HWND  hRichEditWnd =NULL ;
if( GetChatRichEditWnd(&hRichEditWnd))
{
SendMessage( hRichEditWnd , EM_SETSEL , 0 ,-1 ) ;
Sleep(100) ;
PostMessage( hRichEditWnd ,WM_COMMAND , 0XE122 , 0 ) ; if (!IsClipboardFormatAvailable(CF_TEXT)) 
            return FALSE;         if (!OpenClipboard(NULL)) 
            return FALSE; 

HGLOBAL hglb = GetClipboardData(CF_TEXT); 

        if (hglb != NULL) 
        { 
LPTSTR lptstr = (char *)GlobalLock(hglb); 
            if (lptstr != NULL) 
            { 
*lplpstrText = new char[strlen(lptstr)+1] ;
strcpy( *lplpstrText , lptstr ) ;
(*lplpstrText)[strlen(lptstr)] = '\0' ;
                GlobalUnlock(hglb); 
CloseClipboard();
return TRUE ;
            }        }
CloseClipboard();
return FALSE ;
} return FALSE ;
}
bool CQQChatWnd::SetChatText(char *lpstrText)
{ HWND  hRichEditWnd =NULL ;
if( GetChatRichEditWnd(&hRichEditWnd))
{
SendMessage( hRichEditWnd , EM_SETSEL , 0 ,-1 ) ;
Sleep(100) ;
SendMessage( hRichEditWnd , WM_CLEAR , 0 , 0  ) ; HGLOBAL hMem;
LPTSTR pStr =NULL;
// 分配内存空间
hMem = GlobalAlloc(GHND | GMEM_SHARE, strlen(lpstrText)+1); if( hMem!=NULL )
{
pStr = (char *)GlobalLock(hMem);
if( pStr!=NULL )
{
strcpy(pStr, lpstrText);
}
GlobalUnlock(hMem); BOOL  bRet = OpenClipboard(NULL); if( bRet )
{
EmptyClipboard();
// 设置剪贴板文本
SetClipboardData(CF_TEXT, hMem);
CloseClipboard(); Sleep(100) ;
PostMessage( hRichEditWnd ,WM_COMMAND , 0XE125 , 0 ) ;
return TRUE ; }
// 释放内存空间
GlobalFree(hMem);
}
}
return FALSE ;}bool CQQChatWnd::AddChatText(char *lpstrText)
{
   char * lpOldText =NULL ;
   
   if( GetChatText( &lpOldText ) ) 
   {
   char *lpNewText = new char[strlen(lpOldText)+strlen(lpstrText)+1] ;
   
   strcpy( lpNewText , lpOldText ) ;
   strcat( lpNewText , lpstrText ) ;
   
   SetChatText( lpNewText ) ;    delete [] lpOldText ;
   delete []  lpNewText ;
   
   return TRUE ;
   }   return FALSE ;
}bool CQQChatWnd::Chat()
{
HWND  hSendButton = NULL ;
if( GetSendButtonWnd(&hSendButton))
{
SendMessage( hSendButton , WM_LBUTTONDOWN , NULL ,NULL ) ;
    Sleep(100) ;
SendMessage( hSendButton , WM_LBUTTONUP , NULL ,NULL ) ;
return TRUE ;
}
return FALSE  ;
}BOOL CQQChatWnd::SearchRichEditEnumProc(HWND hwnd, LPARAM lParam)
{
//返回值,没有找到的时候继续查找
BOOL fRet = TRUE ;

//要寻找的控件的类名
TCHAR szDefClassName[]="richedit";
TCHAR szAfxClassName[]="afxwnd42" ;

TCHAR szClassName[64] ;
memset( szClassName , 0x0 ,64 ) ;

if( hwnd != NULL )
{
GetClassName( hwnd , szClassName , 64 ) ;
if( _stricmp( szClassName , szDefClassName) ==0)
{
GetClassName( GetParent(hwnd) , szClassName ,64 ) ;
if( _stricmp(szClassName , szAfxClassName) ==0)
{
*(HWND *)lParam = hwnd ;
fRet = FALSE ;
}
} // end if  strcmp ...
}// end if hwnd != NULL

return fRet ;
}BOOL CQQChatWnd::SearchSendButtonEnumProc(HWND hwnd, LPARAM lParam)
{
//返回值,没有找到的时候继续查找
BOOL fRet = TRUE ;

//要寻找的控件的类名
TCHAR szDefClassName[]="Button";
TCHAR szDefCaptionName[]="发送(&S)" ;

TCHAR szCaptionName[64]  ;
TCHAR szClassName[64] ;
memset( szCaptionName , 0x0 , 64 ) ;
memset( szClassName , 0x0 ,64 ) ;

if( hwnd != NULL )
{
GetClassName( hwnd , szClassName , 64 ) ;
if( _stricmp(szClassName , szDefClassName) ==0)
{
GetWindowText( hwnd , szCaptionName , 64 ) ;
if( _stricmp(szCaptionName, szDefCaptionName ) ==0)
{
*(HWND *)lParam = hwnd ;
fRet = FALSE ;
}
} // end if  strcmp ...
}// end if hwnd != NULL
return fRet ;
}BOOL CQQChatWnd::SearchSysModeEnumProc(HWND hwnd, LPARAM lParam)
{
//返回值,没有找到的时候继续查找
BOOL fRet = TRUE ;

//要寻找的控件的类名
TCHAR szDefClassName[]="Button";
TCHAR szDefCaptionName01[]="消息模式(&T)" ;
TCHAR szDefCaptionName02[]="聊天模式(&T)" ;

TCHAR szCaptionName[64]  ;
TCHAR szClassName[64] ;
memset( szCaptionName , 0x0 , 64 ) ;
memset( szClassName , 0x0 ,64 ) ;

if( hwnd != NULL )
{
GetClassName( hwnd , szClassName , 64 ) ;
if( _stricmp(szClassName , szDefClassName) ==0)
{
GetWindowText( hwnd , szCaptionName , 64 ) ;
if( _stricmp(szCaptionName, szDefCaptionName01 ) ==0)
{
*(HWND *)lParam = hwnd ;
fRet = FALSE ;
}
if( _stricmp(szCaptionName, szDefCaptionName02 ) ==0)
{
*(HWND *)lParam = hwnd ;
fRet = FALSE ;
}
} // end if  strcmp ...
}// end if hwnd != NULL
return fRet ;
}

解决方案 »

  1.   

    3.类对外接口说明 
    bool Attatch(HWND  hChatWnd); //初始化类,把hChatWnd聊天窗口同类连接
    bool Detach( HWND hChatWnd);//解除类与hChatWnd的绑定
    bool GetChatText(char **lplpstrText/*out*/) ;//获取聊天内容,内容存放
                                                 //在*lplpstrText
    bool SetChatText( char * lpstrText );//设置聊天内容
    bool AddChatText(char *lpstrText);//增加聊天内容
    bool Chat( void );//聊天动作,模拟点击发送按钮
    int  GetSysMode( void );//获取聊天模式
    bool ChangeSysMode( int nSysMode );//改变聊天模式4.用法#include "QQChatWnd.h"HWND  hwnd = (HWND )0x000B048A ; //qq聊天窗口句柄
    CQQChatWnd  qqchatwin ;
    qqchatwin.Attatch( hwnd ) ;char * lpstrText = NULL ; //必须的qqchatwin.GetChatText( &lpstrText ) ;delete [] lpstrText ; //数据,否则内存泄露int nSysMode = qqchatwin.GetSysMode() ;qqchatwin.ChangeSysMode( P2P_CHAT_MODE ) ;qqchatwin.SetChatText( "hello, dear ") ;
    qqchatwin.AddChatText( "hello, dear ") ;qqchatwin.Chat() ;qqchatwin.Detach( hwnd ) ;
      

  2.   

    HWND  hwnd = (HWND )0x000B048A ; //qq聊天窗口句柄
    -----------------------------------------------------------------------------
    问一个问题
    qq 聊天窗口句柄值0x000B048A  是如何知道的?