关于查找QQ发送窗口的问题

类别:编程语言 点击:0 评论:0 推荐:

看到好多人都在问QQ方面的问题,主要是关于研究QQ尾巴的问题,网络上已经有很多这方面的例子,但是在用到作者提供的代码时候,不能够正确的找到RICHEDIT,因此无法挂接钩子,下面这个方法,应该是可以,同时附带上qqhook的源代码。

测试cpp

#include <afx.h>
//#include <windows.h>

#include "QQHook.h"
#pragma comment(lib, "QQHook.lib")
#include "resource.h"
#define ID_MYTIMER 419 // ¼ÆʱÆ÷ID
BOOL g_bStart;
HWND g_hQQ;
LRESULT CALLBACK ProcMain(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg)
  {
  case WM_CLOSE:
 //   AnimateWindow(hDlg, 800, AW_HIDE | AW_SLIDE | AW_VER_POSITIVE);
    EndDialog(hDlg, 0);
    break;
  case WM_COMMAND:
    {
      if (LOWORD(wParam) == IDC_BTN_CONTROL)
      {
        g_bStart = !g_bStart;
        SetDlgItemText(hDlg, IDC_BTN_CONTROL, g_bStart ? "Í£Ö¹" : "¿ªÊ¼");
        if (g_bStart)
          SetTimer(hDlg, ID_MYTIMER, 1000, NULL);
        else
        {
          KillTimer(hDlg, ID_MYTIMER);
          SetHook(NULL);
        }
      }
      if (LOWORD(wParam) == IDC_BTN_EXIT)
        SendMessage(hDlg, WM_CLOSE, 0, 0);
    }
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  case WM_INITDIALOG:
    {
      int x, y;
      RECT rect;
      g_bStart = FALSE;
      GetWindowRect(hDlg, &rect);
      x = GetSystemMetrics(SM_CXSCREEN) - rect.right + rect.left;
      y = GetSystemMetrics(SM_CYMAXIMIZED) - rect.bottom + rect.top - 10;
      SetWindowPos(hDlg, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
   //   AnimateWindow(hDlg, 800, AW_SLIDE | AW_VER_NEGATIVE);
    }
    break;
  case WM_TIMER:
    {
      if (!IsWindow(g_hQQ))
      {       
        HWND hwnd;
  HWND hSend;
  // CWnd *myWnd;
  int nIdFirst;
  int flag;
  char lpbuf[256];
  //  DWORD a;
        g_hQQ = NULL;
  hwnd=NULL;
  hSend=NULL;
        SetHook(NULL);
  //  do
  //  {
  //    g_hQQ = FindWindowEx(NULL, g_hQQ, "#32770", NULL);   
  
  //   GetWindowText(g_hQQ,lpbuf,255); 
  
  //  if(strcmp(lpbuf,"Óë ·É ÁÄÌìÖÐ")==0)break;
  //   hSend = FindWindowEx(g_hQQ,NULL, "Button", "·¢ËÍ(&S)");  
  
  //  } while(!(g_hQQ != NULL && hSend != NULL));
  nIdFirst=0;
  flag=0;
  while(1)
  {
   g_hQQ=FindWindowEx(NULL, g_hQQ, "#32770", NULL);
   if(g_hQQ==NULL)break;
   GetWindowText(g_hQQ,lpbuf,256);   
   hwnd=GetWindow(g_hQQ,GW_CHILD);

   if(hwnd||::IsWindow(hwnd))
   {
    nIdFirst=GetDlgCtrlID(hwnd);
    do
    {
     GetClassName(hwnd,lpbuf,256);   
     if(strcmp(lpbuf,"#32770")==0)
     {
      hSend=FindWindowEx(hwnd,hSend,"Button","·¢ËÍ(&S)");
      if(hSend)
      {
       flag=1;
       g_hQQ=hwnd;
       break;
      }
     }
     GetWindowText(hwnd,lpbuf,256);   
     hwnd=::GetWindow(hwnd,GW_HWNDNEXT);  
     if(!::IsWindow(hwnd) || hwnd==NULL)  break;
    }while(nIdFirst != GetDlgCtrlID(hwnd)); 
   } 
   if(flag)break;
  }
        if (g_hQQ != NULL)
          SetHook(g_hQQ);
      }
    }
    break;
  }
  return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)ProcMain, 0);
  DWORD a=GetLastError();
  return 0;
}

 

qq hook 源代码

cpp文件

#include <windows.h>
#define QQTAILAPI __declspec(dllexport)
#include "QQHook.h"
// ¶¨Òå¹²ÏíÊý¾Ý¶Î
#pragma data_seg("shared")
HHOOK g_hProc = NULL; // ´°¿Ú¹ý³Ì¹³×Ó¾ä±ú
HHOOK g_hKey = NULL; // ¼üÅ̹³×Ó¾ä±ú
HWND g_hRich = NULL; // Îı¾¿ò¾ä±ú
#pragma data_seg()
#pragma comment(linker, "/section:shared,rws")
// DLL¾ä±ú
HINSTANCE g_hInstDLL = NULL;
// Îҵġ°Î²°Í¡±
TCHAR g_str[] = "\n¶Ô²»Æð£¬ÄúÒѾ­±»½ûÖ¹ÁÄÌ죡";
// º¯Êý¹¦ÄÜ£ºÏòÎı¾¿òÖÐÕ³Ìùβ°Í
void PasteText(HWND hRich)
{
  HGLOBAL hMem;
  LPTSTR pStr;
  // ·ÖÅäÄÚ´æ¿Õ¼ä
  //SendMessage(hRich,WM_SETTEXT,0,LPARAM(""));
  hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(g_str));
  pStr = (LPTSTR)GlobalLock(hMem);
  lstrcpy(pStr, g_str); 
  GlobalUnlock(hMem);
  OpenClipboard(NULL);
  EmptyClipboard();
  // ÉèÖüôÌù°åÎı¾
  SetClipboardData(CF_TEXT, hMem);
  CloseClipboard();
  // ÊÍ·ÅÄÚ´æ¿Õ¼ä
  GlobalFree(hMem);
  // Õ³ÌùÎı¾
  SendMessage(hRich, WM_PASTE, 0, 0);
}
// ¹³×Ó¹ý³Ì£¬¼àÊÓ¡°·¢ËÍ¡±µÄÃüÁîÏûÏ¢
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  CWPSTRUCT *p = (CWPSTRUCT *)lParam;
  // ²¶»ñ¡°·¢ËÍ¡±°´Å¥
  if (p->message == WM_COMMAND && LOWORD(p->wParam) == 1)
    PasteText(g_hRich);
  return CallNextHookEx(g_hProc, nCode, wParam, lParam);
}
// ¼üÅ̹³×Ó¹ý³Ì£¬¼àÊÓ¡°·¢ËÍ¡±µÄÈȼüÏûÏ¢
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  // ²¶»ñÈȼüÏûÏ¢
  if (wParam == VK_RETURN && GetAsyncKeyState(VK_CONTROL) < 0 && lParam >= 0)
    PasteText(g_hRich);
  return CallNextHookEx(g_hKey, nCode, wParam, lParam);
}
// ¹Ò½Ó¹³×Ó
BOOL WINAPI SetHook(HWND hQQ)
{
  BOOL bRet = FALSE;
  if (hQQ != NULL)
  {
    DWORD dwThreadID = GetWindowThreadProcessId(hQQ, NULL);
    // ¸ÐлºÃÓÑhotteyµÄ²éÕÒ´úÂ룬ʡȥÁËÎÒʹÓÃSpy++µÄÂé·³
    g_hRich = GetWindow(GetDlgItem(hQQ, 0), GW_CHILD);
    if (g_hRich == NULL)
      return FALSE;
    // ¹Ò½Ó¹³×Ó
    g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID);
    g_hKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstDLL, dwThreadID);
    bRet = (g_hProc != NULL) && (g_hKey != NULL);
  }
  else
  {
    // жÔع³×Ó
    bRet = UnhookWindowsHookEx(g_hProc) && UnhookWindowsHookEx(g_hKey);
    g_hProc = NULL;
    g_hKey = NULL;
    g_hRich = NULL;
  }
  return bRet;
}
// DLLÖ÷º¯Êý
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  if (fdwReason == DLL_PROCESS_ATTACH)
    g_hInstDLL = hinstDLL;
  return TRUE;
}

 

头文件

#ifndef QQTAILAPI
#define QQTAILAPI __declspec(dllimport)
#endif
QQTAILAPI BOOL WINAPI SetHook(HWND hQQ);

 

本文地址:http://com.8s8s.com/it/it27366.htm