用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();
这里为了方便测试,只列出了文本格式的剪贴板数据替换
测试部分的代码自己写。
- 用HOOK WH_GETMESSAGE实现剪切板数据的更换
- 剪切板Hook
- 基于API HOOK的剪切板监控
- VC使用剪切板实现两个应用程序之间的数据交互
- android利用剪切板来实现数据的传递
- android利用剪切板来实现数据的传递 分类: android
- android利用剪切板来实现数据的传递
- Android 用剪切板传递数据
- MFC中剪切板的使用 把数据拷贝到剪切板和从剪切板中读数据
- 剪切板上文本数据的传送
- 剪切板上文本数据的传送
- 剪切板上文本数据的传送
- 剪切板上文本数据的传送
- Android剪切板传递数据的使用
- (转)Android剪切板传递数据的使用
- Android系统篇之----Hook系统的AMS服务实现应用启动的拦截功能----一、Hook系统剪切板服务流程回顾在之前的一篇文章中已经介绍了 Android中的应用启动流程,这个流程一定要理
- API Hook的实现
- API Hook的实现
- js校验email格式
- 存储过程小结
- Quartz从入门到进阶(转)
- c#概述
- C#编码规范
- 用HOOK WH_GETMESSAGE实现剪切板数据的更换
- 测试中的一些常见问题的分析
- 影响软件测试的一些因素
- C#小结
- 站点测试 Web Testing
- 测试工作管理与规范
- cxGrid增加一栏显示checkBox的设置方法
- [转帖]剪贴板操作
- .net的 start page