六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

简单实现windows下RTX尾巴(上)(c语言)

[复制链接]

升级  23.33%

25

主题

25

主题

25

主题

秀才

Rank: 2

积分
85
 楼主| 发表于 2013-1-26 12:30:20 | 显示全部楼层 |阅读模式
仿照网上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)#endifBOOL 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);}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表