我这个VB程序员的VC编码体验
/********************************************************************/ /* 文件名: MyMouseHook.cpp */ /* */ /* 功能: 标准 DLL ---- 利用鼠标全局钩子实现右键双击粘贴功能 */ /* */ /* 作者: 李博 (booolee) 时间: 2004.9.18 */ /* */ /* BLOG: http://blog.csdn.net/booolee */ /********************************************************************/
// 导出函数列表 // StartHook // StopHook // About
#define _WIN32_WINNT 0x0500 // 设置系统版本, 确保可以使用底层鼠标钩子
#include "windows.h" #include <string.h>
// 全局变量 HINSTANCE g_hInstance = NULL; // 模块实例句柄 HHOOK g_hHook = NULL; // 钩子句柄
// DLL 入口函数 BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { // 保存模块实例句柄 g_hInstance = (HINSTANCE)hModule; // 在进程结束或线程结束时卸载钩子 switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook); break; } return TRUE; }
// 底层鼠标钩子函数 LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam; if (nCode>=0) { //双击鼠标右键进行粘贴操作 if (wParam==WM_RBUTTONDBLCLK) { HWND glhTargetWnd=pMouseHook->hwnd; if(glhTargetWnd !=NULL) { SendMessage(glhTargetWnd,WM_PASTE,0,0); return TRUE; } } //单击鼠标中键进行数据复制 if(wParam==WM_MBUTTONUP) { HWND glhTargetWnd=pMouseHook->hwnd; LPTSTR tmpstr=NULL; char buf[100]; SendMessage(glhTargetWnd,WM_GETTEXT,sizeof(buf)/sizeof(char),(LPARAM)(void*)buf); int dwLength = 100; // 要复制的字串长度 HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1); // 分配内存 LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory); // 锁定内存 for (int i = 0; i < dwLength-1; i++) // 将buf复制到全局内存块 { //如果是米或平方米的单位字符,则不进行复制 if(buf[i]!='m') { *lpGlobalMemory++ = buf[i]; } else { break; } } GlobalUnlock(hGlobalMemory); // 锁定内存块解锁 OpenClipboard(NULL); EmptyClipboard(); // 清空剪贴板 SetClipboardData(CF_TEXT, hGlobalMemory); // 将内存中的数据放置到剪贴板 CloseClipboard(); // 关闭剪贴板 //MessageBox(NULL,buf,NULL,MB_OK);
//通过消息方式进行复制代码开始 //if(glhTargetWnd!=NULL) //{ // SendMessage(glhTargetWnd,WM_COPY,0,0); // return TRUE; //} //通过消息方式进行复制代码结束 } } // 传给系统中的下一个钩子 return CallNextHookEx(g_hHook, nCode, wParam, lParam); }
/********************************************************************/ /* 安装鼠标钩子 */ /* 参数: (无) */ /* 返回值: TRUE 成功, FALSE 失败 */ /********************************************************************/ BOOL WINAPI StartHook() { // 如果已经安装鼠标钩子则返回 FALSE if (g_hHook != NULL) return FALSE; // 安装底层鼠标钩子 g_hHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, g_hInstance, NULL); if (g_hHook == NULL) return FALSE; MessageBox(NULL,"启动成功!\n\n复制功能:单击鼠标中键(滚轮)复制数据到剪贴板\n粘贴功能:双击鼠标右键从剪贴板粘贴数据\n复制时自动去除米和平米单位","BOBO鼠标粘贴器1.1",MB_OK); return TRUE; }
/********************************************************************/ /* 卸载鼠标钩子 */ /* */ /* 参数: (无) */ /* */ /* 返回值: TRUE 成功, FALSE 失败 */ /********************************************************************/ BOOL WINAPI StopHook() { // 卸载钩子 if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE; g_hHook = NULL; MessageBox(NULL,"卸载成功!","BOBO鼠标粘贴器",MB_OK); return TRUE; }
BOOL WINAPI About() { MessageBox(NULL,"作者:李博\n功能:快速通过鼠标进行剪贴板操作\n日期:2004.9.25\n邮件:[email protected]","关于BOBO鼠标粘贴器 1.1",MB_OK); return TRUE; }

|