最近单位有大量图象矢量化的工作,时间紧任务重,数化员除了图形绘制还要对图形进行属性设置,因为使用的国外某软件,属性填写部分右键菜单被屏蔽了,所以数化员都需要CTRL+V,就这个键盘的操作动作对于大量的数化工作来说是个非常降低效率的操作,所以写了一个通过右键双击就可以进行粘贴的全局钩子,一经应用,果然工作进度提高了不少,并且数化工作变的轻松了许多,下面就是VC6中编写的代码,写这个钩子过程也遇到过一些困难,不希望有其他朋友也遇到,所以发出代码,供需要的朋友使用,这个代码是根据网友代码修改得来,再次感谢网友卢培培(http://blog.csdn.net/goodname008)。
全局钩子DLL由VC6编写,数化助手是由VB6编写。
下载编译好的程序:http://www.cjsdn.net/user/download/112563/RDPaster.rar
/********************************************************************/
/* 文件名: MyMouseHook.cpp */
/* */
/* 功能: 标准 DLL ---- 利用鼠标全局钩子实现右键双击粘贴功能 */
/* */
/* 作者: 李博 (booolee) 时间: 2004.9.18 */
/* */
/* BLOG: http://blog.csdn.net/booolee */
/********************************************************************/
// 导出函数列表
// StartHook
// StopHook
// About
#define _WIN32_WINNT 0x0500 // 设置系统版本, 确保可以使用底层鼠标钩子
#include "windows.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)
{
char * buffer = NULL;
if (OpenClipboard(NULL))
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
SetWindowText(glhTargetWnd,buffer);
GlobalUnlock(hData);
CloseClipboard();
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,"启动成功!","BOBO鼠标双击右键粘贴器",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.18/n邮件:[email protected]","关于鼠标钩子",MB_OK);
return TRUE;
}
********************************************************************/
/* 文件名: MyMouseHook.h */
/* */
/* 功能: 标准 DLL 导出函数头文件, 在使用该DLL的程序中包含此文件 */
/* */
/* 作者: 李博 (booolee) 时间: 2004.9.18 */
/* */
/* BLOG: http://blog.csdn.net/booolee */
/********************************************************************/
DECLSPEC_IMPORT
BOOL
WINAPI
StartHook();
DECLSPEC_IMPORT
BOOL
WINAPI
StopMaskKey();
DECLSPEC_IMPORT
BOOL
WINAPI
About();
MaskKey.def代码如下
EXPORTS
StartHook @1
StopHook @2
About @3
VB6中引用钩子的声明
Declare Function StartHook Lib "MyMouseHook" () As Long
Declare Function StopHook Lib "MyMouseHook" () As Long
Declare Function About Lib "MyMouseHook" () As Long