`
jerry1985
  • 浏览: 29976 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

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);
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics