仿照网上QQ尾巴的例子实现一个简单的RTX尾巴,运行后会从固定的服务器下载键盘钩子(由于不会获取发送按钮的句柄,目前只实现了键盘钩子),然后安装钩子。在用户使用ctrl+enter发送消息时,会在消息的尾部添加如下一段话:[**********The brown quick fox jumps over the lazy dog.**********]。
ps:希望高手能教教我如何获得发送按钮的句柄,在下感激不尽!
rtxkeyhook.h
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif
BOOL KEYHOOKLIB_API WINAPI SetHook(HANDLE);
BOOL KEYHOOKLIB_API WINAPI DropHook();
void PasteText(HANDLE);
int GetTextLen(HANDLE);
rtxkeyhook.c
#include <windows.h>
#include <stdio.h>
#define KEYHOOKLIB_EXPORTS
#include "rtxkeyhook.h"
#pragma data_seg("HOOKShared")
HHOOK g_hKey = NULL;
HANDLE g_hRich = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:HOOKShared,RWS")
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(wParam == VK_RETURN && GetAsyncKeyState(VK_CONTROL) < 0 && lParam >= 0)
{
if(g_hRich != NULL && GetTextLen(g_hRich) > 0)
{
PasteText(g_hRich);
}
}
return CallNextHookEx(g_hKey, nCode, wParam, lParam);
}
int GetTextLen(HANDLE hRich)
{
char szText[1000];
SendMessage(hRich, WM_GETTEXT, sizeof(szText), (LPARAM)szText);
return strlen(szText);
}
void PasteText(HANDLE hRich)
{
HGLOBAL hMem;
char *pStr;
char gStr[100] = "\n**********The brown quick fox jumps over the lazy dog.**********\n";
hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(gStr));
pStr = GlobalLock(hMem);
lstrcpy(pStr, gStr);
GlobalUnlock(hMem);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
SendMessage(hRich, WM_PASTE, 0, 0);
}
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
BOOL WINAPI SetHook(HANDLE hDlg)
{
DWORD dwThreadId = GetWindowThreadProcessId(hDlg, NULL);
g_hRich = FindWindowEx(hDlg, NULL, "RichEdit20W", NULL);
if(g_hRich == NULL)
{
printf("can not find edit control !\n");
return FALSE;
}
g_hKey = SetWindowsHookEx(WH_KEYBOARD,
KeyHookProc,
ModuleFromAddress(KeyHookProc),
dwThreadId);
if(g_hKey != NULL)
{
printf("hook ready !\n");
return TRUE;
}
return FALSE;
}
BOOL WINAPI DropHook()
{
return UnhookWindowsHookEx(g_hKey);
}