用HOOK WH_GETMESSAGE实现剪切板数据的更换

来源:互联网 发布:linux嵌入式学什么 编辑:程序博客网 时间:2024/06/04 23:35

从用户的角度来说,我只要挂接剪贴板的黏贴消息就可以实现对剪贴板的控制,当然也可以研究其他的剪贴板消息

以下是DLL代码的实现部分 

// MessageHook.cpp : 定义 DLL 的初始化例程。
//

#include "stdafx.h"
#include <afxdllx.h>
#include "hook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static AFX_EXTENSION_MODULE MessageHookDLL = { NULL, NULL };
#pragma data_seg("Mydata")

HINSTANCE MyInstance=NULL;
HHOOK MyHook=NULL;

#pragma data_seg()


extern "C" LRESULT CALLBACK MsgProc(int code,WPARAM wParam,LPARAM lParam);

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 // 如果使用 lpReserved,请将此移除
 UNREFERENCED_PARAMETER(lpReserved);

 if (dwReason == DLL_PROCESS_ATTACH)
 {
  TRACE0("MessageHook.DLL 正在初始化!/n");
  
  // 扩展 DLL 一次性初始化
  if (!AfxInitExtensionModule(MessageHookDLL, hInstance))
   return 0;

  // 将此 DLL 插入到资源链中
  // 注意: 如果此扩展 DLL 由
  //  MFC 规则 DLL(如 ActiveX 控件)隐式链接到
  //  而不是由 MFC 应用程序链接到,则需要
  //  将此行从 DllMain 中移除并将其放置在一个
  //  从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
  //  规则 DLL 然后应显式
  //  调用该函数以初始化此扩展 DLL。否则,
  //  CDynLinkLibrary 对象不会附加到
  //  规则 DLL 的资源链,并将导致严重的
  //  问题。

  new CDynLinkLibrary(MessageHookDLL);
  MyInstance=hInstance;
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  TRACE0("MessageHook.DLL 正在终止!/n");

  // 在调用析构函数之前终止该库
  AfxTermExtensionModule(MessageHookDLL);
 }
 return 1;   // 确定
}

extern "C" void InstallHook()
{
 TRACE0("InstallHook start /n");
 MyHook=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,MyInstance,0);
}


extern "C" LRESULT CALLBACK MsgProc(int code,WPARAM wParam,LPARAM lParam)
{
 TRACE0("MESSAGE HOOK here...... /n");
 if(code<0){
  return CallNextHookEx(MyHook,code,wParam,lParam);
 }
 MSG * msg=(MSG*)lParam;
 if(msg->message==WM_PASTE)
 {
  if(OpenClipboard(NULL)==NULL)
  {
   return 0;
  }
  //获得剪贴板数据
  HANDLE hClipBoardData=GetClipboardData(CF_TEXT);
  char * buffer=(char *)GlobalLock(hClipBoardData);
  
  //向剪贴板中发数据
  HGLOBAL clipbuffer;
  CString mystring="this is my buffer";
  EmptyClipboard();
  char * mybuffer=NULL;
  //分配共享内存
  clipbuffer=GlobalAlloc(GMEM_DDESHARE,mystring.GetLength()+1);
  //锁定内存,把clipbuffer内存快的指针给buffer
  mybuffer = (char*)GlobalLock(clipbuffer);
  strcpy(mybuffer,mystring);
  GlobalUnlock(clipbuffer);

  SetClipboardData(CF_TEXT,clipbuffer);


  if(CloseClipboard()==NULL)
  {
   return 0;
  }
  return CallNextHookEx(MyHook,code,wParam,lParam);
 }
 else
  return CallNextHookEx(MyHook,code,wParam,lParam);

 ////如果消息已被处理过则返回不管了  
 //if(wParam!=PM_REMOVE)return   CallNextHookEx(MyHook,code,wParam,lParam);
 //if(msg->message==WM_CHAR)
 //{
 // TRACE0("WM_CHAR MESSAGE... /n");
 // return 1;
 //}
 //return CallNextHookEx(MyHook,code,wParam,lParam);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//hook.h

extern "C" void InstallHook();

 

这里为了方便测试,只列出了文本格式的剪贴板数据替换

 

测试部分的代码自己写。

原创粉丝点击