-
-
[求助]自己写的HOOK 复制和粘贴键的代码,有些疑问,请教一下老师们.
-
发表于:
2011-1-2 22:48
4537
-
[求助]自己写的HOOK 复制和粘贴键的代码,有些疑问,请教一下老师们.
这是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解题方法汇总!