按照QQ现在的算法: 30sec < 上线时间 < 1min
每30秒给QQ发送下线,然后在上线的消息达到刷时间的效果(这里我只写了隐身登陆,一般也是用隐身,否则好友非把你杀了不可..)
首先用SPY++查出QQ上线,下线和隐身的消息:
上线: WINDOWS 发送 WM_COMMAND 消息给QQ, wParam参数为 0x00003390 , lParam为0
下线: WINDOWS 发送 WM_COMMAND 消息给QQ, wParam参数为 0x00003393 , lParam为0
隐身: WINDOWS 发送 WM_COMMAND 消息给QQ, wParam参数为 0x00003392 , lParam为0
查找QQ登陆以后主窗口的方法:
1. 用EnumWindows枚举窗口,判断窗口的类名是否为"#32770",如果是则用FindWindowEx查找窗口下是否存在类名为"Tencent_QQBar"的子窗口,如果存在则说明为QQ
2. 用GetTopWindow得到最顶的那个窗口,然后GetNextWindow一个一个找是否有类名为"Tencent_QQBar"的子窗口
还有很多其他方法
现在得到了QQ的句柄,也知道发送什么样的消息,建立定时器,SendMessage吧.
程序代码:
#include <windows.h>
#include "resource.h"
#define LEN 100
#define ID_TIMER 1
#define QQ_ONLINE 0x00003390
#define QQ_STEALTH 0x00003392
#define QQ_OFFLINE 0x00003393
HWND hqqWnd;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char sTime[LEN];
switch(message)
{
case WM_INITDIALOG:
SetDlgItemText(hDlg, IDC_EDIT_TIME, "35");
return TRUE;
break;
case WM_TIMER:
SendMessage(hqqWnd, WM_COMMAND, (WPARAM)QQ_OFFLINE, 0);
SendMessage(hqqWnd, WM_COMMAND, (WPARAM)QQ_STEALTH, 0);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_START:
GetDlgItemText(hDlg, IDC_EDIT_TIME, sTime,LEN);
SetTimer(hDlg, ID_TIMER, atoi(sTime)*1000, NULL);
SendMessage(hDlg, WM_TIMER, 0, 0);
break;
case IDC_STOP:
KillTimer(hDlg, ID_TIMER);
break;
case IDCANCEL:
KillTimer(hDlg, ID_TIMER);
EndDialog(hDlg, 0);
return TRUE;
}
break;
}
return FALSE;
}
BOOL CALLBACK SearchQQ(HWND hwnd, LPARAM lParam)
{
char className[LEN] = {0};
GetClassName(hwnd, className, LEN);
if(strcmp(className, "#32770") == 0)
{
if(FindWindowEx(hwnd, NULL, "Tencent_QQBar", NULL))
{
hqqWnd = hwnd;
return FALSE;
}
}
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
/*另外一种查找QQ窗口句柄的方法,不知道和EnumWindows比谁效率高...
hqqWnd = GetTopWindow(NULL);
while(hqqWnd = GetNextWindow(hqqWnd, GW_HWNDNEXT))
{
if(FindWindowEx(hqqWnd, NULL, "Tencent_QQBar", NULL))
break;
}
*/
EnumWindows(SearchQQ, 0);
if(hqqWnd==NULL)
{
MessageBox(NULL, "没有找到QQ,请确认是否开启QQ!", "没找到QQ,退出", MB_OK);
return 0;
}
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, DlgProc);
return 0;
}
这样就写好了一个刷时间的工具.
不过试了下,好象没什么效果了,估计被腾讯把这个设定改了
最后的程序是这样的:
对话框ID为 IDD_MAINDLG
开始按钮ID为 IDC_START
停止按钮ID为 IDC_STOP
文本框ID为 IDC_EDIT_TIME, 初值为35