首页
社区
课程
招聘
[求助]自己写的HOOK 复制和粘贴键的代码,有些疑问,请教一下老师们.
发表于: 2011-1-2 22:48 4537

[求助]自己写的HOOK 复制和粘贴键的代码,有些疑问,请教一下老师们.

2011-1-2 22:48
4537
这是dll里面的代码:
主要功能:用户按下一次CTRL+C后,从剪贴板中取出复制的数据,放到程序里面的数组第一个成员,
 再次按下CTRL+C,再从剪贴板中取出复制的数据,再次放到数组的第二个成员,,最多放20组

用户按下CTRL+V,先清空剪贴板,再把存放在数组中的[COLOR="red"]最后一个成员(成员i)[/COLOR]的数据放到剪贴板,然后贴粘到目标程序中去.
再次按下CTRL+V,就把就把[COLOR="red"]成员(i-1)[/COLOR]的数据放到剪贴板,然后贴粘到目标程序中去.


下面是代码:

#include "Dll.h"
HWND g_hWng=NULL;
HHOOK g_hKey=NULL;
#pragma data_seg("Hook")
	TCHAR pszCliData[20][255]={0};  //把存放数据的数组和
	int i=0;                                          //数组下标设为共享区段
#pragma data_seg()

#pragma comment(linker,"/section:Hook,RWS")  //设置区段为读写共享

///////////////////////////////////////////////////////////////////
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
	if(i>19) return CallNextHookEx(g_hKey,code,wParam,lParam); //数组中最多只能存20条记录
	if ((wParam==0x43) && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) //CTRL和C键同时处于按下状态时
	{
		if (OpenClipboard(g_hWng))  //打开剪贴板
		{
			if(IsClipboardFormatAvailable(CF_UNICODETEXT)) //判断剪贴板中内容是不是UNICODE字符
			{
				HGLOBAL hCli;
				hCli=GetClipboardData(CF_UNICODETEXT);  //如果是UNICODE就获取剪贴板数据
				_tcscpy(pszCliData[i],(PTCHAR)GlobalLock(hCli));//放到pszCliData数组中
				GlobalUnlock(hCli);
				MessageBox(g_hWng,pszCliData[i],_T("复制内容"),MB_OK);
				i++;
			}
			CloseClipboard();
		}
	}

	if ((wParam==0x56) && (GetAsyncKeyState(VK_CONTROL) & 0x8000)) //处理Ctrl+v
	{
		if (OpenClipboard(g_hWng))
		{
			EmptyClipboard();//先清空
			HGLOBAL hCli;
			PTCHAR pBuf;
			hCli=GlobalAlloc(GMEM_MOVEABLE,_tcslen(pszCliData[i]));//取数组中最后一次复制的数据,依次往前取
			pBuf=(PTCHAR)GlobalLock(hCli);
			_tcscpy(pBuf,pszCliData[i]);
			GlobalUnlock(hCli);
			SetClipboardData(CF_UNICODETEXT,pszCliData[i]); //从数组中取出数据放到剪贴板
			MessageBox(g_hWng,pszCliData[i],_T("粘贴内容"),MB_OK);
			CloseClipboard();
			i--;
		}
	}
	return CallNextHookEx(g_hKey,code,wParam,lParam);
}

///////////////////////////////////////////////////////////////////
BOOL SetHook(HWND& hwnd,HHOOK& hook)
{
	g_hKey=hook;
	g_hWng=hwnd;
	hook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(_T("Dll.dll")),0);//安装全局钩子
	if (hook==NULL)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL UnHook(HHOOK& hook)
{
	return UnhookWindowsHookEx(hook);
}


这样写后,程序就不能正常的复制了,
经按下CTRL+C,用MessageBox弹出的数据始终是第一次复制的数据,
按下CTRL+V就没反映了。。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
请注意一下挂钩函数与被挂钩函数之间执行的先后顺序。
至于按下CTRL+V就没反映,自己调试一下吧。
2011-1-3 14:29
0
游客
登录 | 注册 方可回帖
返回
//